函数和闭包
用 func 来声明一个函数。通过函数名加参数列表来调用函数。用-> 隔开参数列表和函数的返回类型。
func greet(name: String, day: String) -> String {
return "Hello \(name), today is \(day)."
}
greet("Bob", "Tuesday")
删除day这个参数。添加一个参数,表示今天的午餐。
用一个tuple(元组)使函数返回多个值。
func getGasPrices() -> (Double, Double, Double) {
return (3.59, 3.69, 3.79)
}
getGasPrices()
func sumOf(numbers: Int...) -> Int {
var sum = 0
for number in numbers {
sum += number
}
return sum
}
sumOf()
sumOf(42, 597, 12)
写一个函数计算它的参数的平均数。
函数可以嵌套,嵌套的函数可以访问外部函数中声明的变量。如果一个函数代码比较长或是比较复杂可以用嵌套函数来简化。
func returnFifteen() -> Int {
var y = 10
func add() {
y += 5
}
add()
return y
}
returnFifteen()
函数也可以作为另一个函数的返回值。
func makeIncrementer() -> (Int -> Int) {
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne
}
var increment = makeIncrementer()
increment(7)
函数也可以作为另一个函数的参数。
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)
函数实际上是一种特殊的闭包。用大括号{}来写一个匿名的闭包,在大括号中用 in 关键字将参数,返回类型从正文代码中区分开。
numbers.map({
(number: Int) -> Int in
let result = 3 * number
return result
})
重写上面的闭包,如果是奇数就返回 0。
还可以将闭包写的更简洁。当已知闭包的类型,例如,是一个代理回调函数,可以省略参数的类型和返回类型。单一语句的闭包会隐式的返回语句的值。
numbers.map({ number in 3 * number })
sort([1, 5, 3, 12, 2]) { $0 > $1 }