swift3.0 逃逸的“闭包”

Posted ZHZMAREN

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift3.0 逃逸的“闭包”相关的知识,希望对你有一定的参考价值。

首先了解一下@escaping 和 @noescape 的含义,在swift2中,你可能遇到过@noescape属性,不过在swift3.0中已经被移除了(原因很简单:很简单,在swift3.0中@noescape被用作一个默认值),替而换之的是@escaping。

逃逸的闭包理解:如果一个闭包被作为一个参数传递给一个函数,并且在函数return之后才被唤起执行,那么这个闭包是逃逸闭包。并且这个闭包的参数是可以“逃出”这个函数体外的。

可以看到requestAuthorization(_:)方法接收了一个参数:一个闭包。在swift2中,闭包默认是可以“逃逸”到函数体外的,这就是为什么上面的例子没有报编译错误。注意completion作为一个参数传递给HKHealthStore 的requestAuthorizationToShareTypes(_:readTypes:completion:)方法,这个方法是异步的,也就是说这个闭包会在requestAuthorization(_:)函数return之后执行。换句话说,我们传给requestAuthorization(_:)的这个闭包逃逸了,它已经逃逸出了这个函数体。

如果我们给requestAuthorization(_:)函数参数添加一个@noescape属性会变得非常有趣,下面是添加@noescape属性的例子:


而在3.0中:编译提示:


enter之后:


PS::::这个@escaping属性写在参数类型的前面而不是参数名称的前面。这是swift3里一个新的点。

所以@escaping的含义

这个提醒我们去理解@escaping属性的含义。因为在swift3中闭包默认是不可逃逸的,逃逸闭包需要像这样被标记。@escaping属性让我们可以那样做。

我们通过@escaping属性标记闭包,编译错误就消失了。


以上是关于swift3.0 逃逸的“闭包”的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发-Swift进阶之闭包,逃逸闭包 & 非逃逸闭包!

Swift3.0 函数闭包与OC Block

Swift3.0-closure的@autoclosure和@escaping

在 Swift 3.0 中的转义闭包中改变自我(结构/枚举)

Swift 3.0 错误:转义闭包只能按值显式捕获 inout 参数

Swift3.0 - 黑魔法swizzle