- 闭包的语法
定义:
{ (`参数`) -> `返回类型` in
`代码块`
}
例如:
1.1 一般表达式
reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
return s1 > s2
})
1.2 从上下文中推断类型
reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )
1.3 单行表达式可以省略 return(单行表达式是指闭包函数体只包含了一个单一表达式s1 > s2)
reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )
1.4 参数名称缩写($0 和 $1 表示闭包中第一个和第二个 String 类型的参数)
reversedNames = names.sorted(by: { $0 > $1 } )
1.5 运算符缩写($0 和 $1 表示闭包中第一个和第二个 String 类型的参数)
reversedNames = names.sorted(by: >)
- 尾随闭包
func someFunctionThatTakesAClosure(closure: () -> Void) {
// function body goes here
}
尾随闭包能将闭包内容放到函数调用的后面,前提是闭包参数在参数列表的最后面
someFunctionThatTakesAClosure() {
// trailing closure's body goes here
}
- 闭包逃离
通过设置关键字@escaping 能将闭包存储外部数组中
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
completionHandlers.append(completionHandler)
}
- 自动闭包
通过设置关键字@ autoclosure 能将接收到的表达式自动闭包
var customersInLine = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
func serve(customer customerProvider: @autoclosure () -> String) {
print("Now serving \(customerProvider())!")
}
serve(customer: customersInLine.remove(at: 0))
// Prints "Now serving Ewa!"
网友评论