升级到Swift3.0后,需要明确指出逃逸闭包,可以帮助编译器进行优化
逃逸闭包:可以逃离出所在函数执行的
非逃逸闭包:在函数中执行的
举个例子,异步的网络请求的回调是一个逃逸闭包
func asyncNetworkRequest(url:String, handler:((_ result:String) -> ())) {
// 以下伪代码示意
HttpClient.Get(url, handler)
}
如代码中闭包handler就是一个逃逸闭包,当其他其他代码调用asyncNetworkRequest函数的时候,执行完HttpClient.Get后会立即返回,此时网络请求可能甚至还没有真正发出。直至若干时间后请求应答返回后,才会由HttpClient再调用handler从而执行闭包。
再举个例子,排序sort中可以传递的闭包是一个非逃逸闭包
array.sort(by: {$0 > $1}
其中的闭包{$0 > $1}会在sort这个函数执行过程中使用,用来比较元素的大小。