本节书摘来自异步社区《Swift开发实战》一书中的第2章,第2.4节函数和闭包,作者 李宁,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.4 函数和闭包
在本章前面的实例2-1中,testfunc就是一个函数。在Swift语言中,使用关键字func来声明一个函数,使用名字和参数来调用函数,使用“→”来指定函数返回值。例如,如下所示的演示代码。
func greet(name: String, day: String) -> String {
return "Hello \(name), today is \(day)."
}
greet("Bob", "Tuesday")
在Swift语言中,使用一个元组来返回多个值。例如,如下所示的演示代码。
func getGasPrices() -> (Double, Double, Double) {
return (3.59, 3.69, 3.79)
}
getGasPrices()
在Swift语言中,函数可以带有可变个数的参数,这些参数在函数内表现为数组的形式。例如,如下所示的演示代码。
func sumOf(numbers: Int...) -> Int {
var sum = 0
for number in numbers {
sum += number
}
return sum
}
sumOf()
sumOf(42, 597, 12)
在Swift语言中,可以使用嵌套函数,被嵌套的函数可以访问外侧函数的变量,也可以使用嵌套函数来重构一个太长或者太复杂的函数。例如,如下所示的演示代码。
func returnFifteen() -> Int {
var y = 10
func add() {
y += 5
}
add()
return y
}
returnFifteen()
在Swift语言中,一个函数可以作为另一个函数的返回值。例如,如下所示的演示代码。
func makeIncrementer() -> (Int -> Int) {
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne
}
var increment = makeIncrementer()
increment(7)
在Swift语言中,函数可以当做参数被传入到另一个函数中。例如,如下所示的演示代码。
func hasAnyMatches(list: Int[], condition: Int -> Bool) -> Bool {
for item in list {
if condition(item) {
return true
}
}
return false
}
func lessThanTen(number: Int) -> Bool {
return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, lessThanTen)
在Swift语言中,函数实际上是一种特殊的闭包,可以使用“{}”来创建一个匿名闭包。使用关键字“in”将参数和返回值类型声明与闭包函数体进行分离。例如,如下所示的演示代码。
numbers.map({
(number: Int) -> Int in
let result = 3 * number
return result
})
在Swift语言中,有很多种创建闭包的方法。如果已知一个闭包的类型,比如作为一个回调函数,那么就可以忽略参数的类型和返回值。单个语句闭包会把语句的值当做结果返回。例如,如下所示的演示代码。
numbers.map({ number in 3 * number })
在Swift语言中,可以通过参数位置而不是参数名字来引用参数,这个方法在非常短的闭包中非常有用。当一个闭包作为最后一个参数传给一个函数时,这个闭包可以直接跟在括号后面。例如,如下所示的演示代码。
sort([1, 5, 3, 12, 2]) { $0 > $1 }