在关闭map或reduce方法时访问实例变量时,我可以省略self吗?

时间:2016-09-25 21:52:19

标签: ios swift

我知道我应该在闭包中使用self来访问实例变量,如果我不这样做,Xcode会显示错误,但是当我在关闭reduce方法时省略self时,我没有得到错误。  在那种情况下,我可以省略自己吗?

案例A

gridsCount = (0..<collectionView!.numberOfSections()).reduce(0) { [weak self] (sum, section) -> Int in
   return sum + self.gridsInSection(section)
}

案例B

gridsCount = (0..<collectionView!.numberOfSections()).reduce(0) { (sum, section) -> Int in
   return sum + gridsInSection(section)
}

1 个答案:

答案 0 :(得分:1)

您可以在块中省略self的原因在于函数声明中存在@noescape关键字:

@warn_unused_result @rethrows func reduce<T>(initial: T, 
   @noescape combine: (T, Self.Generator.Element) throws -> T) rethrows -> T

来自Xcode 6 release notes

  

新的 @noescape 属性可用于函数的闭包参数。这表示该参数仅在调用中被调用(或作为@noescape参数传递),这意味着它不能超过调用的生命周期。

     

这可以实现一些次要的性能优化,但更重要的是禁用闭包参数中的self.要求。

@noescape阻止保留self,这对于使用闭包以同步方式运行它是完全正确的,您可以确保self将在课程中存活执行。

如果您的闭包将用作某种异步操作(例如网络请求)的完成块,则从库等检索媒体文件,您需要self到保留并在块内保持活着,不要用@noescape标记。