我知道我应该在闭包中使用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)
}
答案 0 :(得分:1)
您可以在块中省略self
的原因在于函数声明中存在@noescape
关键字:
@warn_unused_result @rethrows func reduce<T>(initial: T, @noescape combine: (T, Self.Generator.Element) throws -> T) rethrows -> T
新的 @noescape 属性可用于函数的闭包参数。这表示该参数仅在调用中被调用(或作为
@noescape
参数传递),这意味着它不能超过调用的生命周期。这可以实现一些次要的性能优化,但更重要的是禁用闭包参数中的
self.
要求。
@noescape
阻止保留self
,这对于使用闭包以同步方式运行它是完全正确的,您可以确保self
将在课程中存活执行。
如果您的闭包将用作某种异步操作(例如网络请求)的完成块,则从库等检索媒体文件,您需要self
到保留并在块内保持活着,不要用@noescape
标记。