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



我知道我应该在闭包中使用self来访问实例变量,如果我不使用,Xcode会显示错误,但当我在reduce方法的闭包中省略self时,我没有得到错误。在那种情况下我能省略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)
}

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

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

来自Xcode 6发行说明:

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

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

@noescape防止self被保留,这对于使用闭包以同步方式运行它是完全可以的,因为您确信self在执行过程中是活动的。

如果您的闭包将被用作某种异步操作的完成块,如网络请求、从库中检索媒体文件等。如果您非常需要保留self并在块内保持活动,则不使用@noescape标记它。

相关内容

最新更新