Closure Expression Syntax (语法定义)
{ (parameters) -> return type in
statements
}
看一个例子,对字符串数组排序:
var names = […]
var reversed = sorted(names, {(s1: String, s2: String) -> Bool in
return s1 > s2
})
swift还提供了一连串的简化方法:
1. Referring Type from Context (从上下文环境中推断参数和返回值的类型,就可以省略不写了)
var reversed = sorted(names, {s1, s2 in return s1 > s2})
2. Implicit Returns from Single-Expression Closures (如果只有一行语句,return 也可以省略)
var reversed = sorted(names, {s1, s2 in s1 > s2})
3. Shorthand Argument Names (命名参数也可以省略,用 $n 代替)
var reversed = sorted(names, {$0 > $1})
4. Operator Functions (直接用操作符)
var reversed = sorted(names, >)
. Trailing Closures (如果Closure是最后一个参数,可以写在参数括号的外面)
sample 1:
var reversed = sorted(names) { $0 > $1}
sample 2:
let digitNames = [
0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four",
5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
]
let numbers = [16, 58, 510]
numbers.map {
(var number) -> String in
var output = ""
while number > 0 {
output = digitNames[number%10]! + output
number /= 10
}
return output
}
. Capturing Values (访问上下文中的变量,即使外部函数已经结束,它所捕获的变量依然存在,见下面例子中的runningTotal )
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementer() -> Int {
runningTotal += amount
return runningTotal
}
return incrementer
}
let incrementByTen = makeIncrementer(forIncrement: 10)
incrementByTen() 10
incrementByTen() 20
let incrementBySeven = makeIncrementer(forIncrement: 7)
incrementBySeven() 7
incrementBySeven() 14
. Closures Are Reference Types (Closure是引用类型,还是看 runningTotal)
let alsoIncrementByTen = incrementByTen
alsoIncrementByTen() 30