逃逸闭包(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这个函数执行过程中使用,用来比较元素的大小。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代...
    穷人家的孩纸阅读 5,665评论 1 5
  • 本章将会介绍 闭包表达式尾随闭包值捕获闭包是引用类型逃逸闭包自动闭包枚举语法使用Switch语句匹配枚举值关联值原...
    寒桥阅读 5,445评论 0 3
  • 闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代...
    雨影阅读 3,989评论 0 2
  • 闭包是自包含的代码块,可以在代码中被传递和使用。Swift中的闭包与C和Objective-C中代码块(block...
    Raaaaamsey阅读 4,264评论 0 2
  • 许多年以后,我很后悔一件事情。 ——为什么好死不死的非要学工科? 在我明白了工科专业的男女比例以后,我跟表弟说:“...
    纪云书阅读 2,854评论 0 1