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属性标记闭包,编译错误就消失了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值