逃逸闭包(escaping) vs 非逃逸闭包(nonescaping)

升级到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这个函数执行过程中使用,用来比较元素的大小。

你可能感兴趣的:(逃逸闭包(escaping) vs 非逃逸闭包(nonescaping))