在Swift中,如果我有一个捕获[weakself]的闭包,在闭包的开头解开可选的self是一种好习惯吗?
我在 macOS 应用程序中使用 Swift,Xcode 是 12.5.1。想象一下,我有以下代码:
func performAsyncTask(completion: { [weak self] (error: Error?) in
self?.someProperty = 0.0
self?.someOtherProperty = 0.0
// Other similar statements follow
})
将其更改为:
func performAsyncTask(completion: { [weak self] (error: Error?) in
guard let self = self else { return }
self.someProperty = 0.0
self.someOtherProperty = 0.0
// Other similar statements follow
})
我相信第一个实现更好,因为 self 可能在语句之间变为 nil ,因此在开始时展开可能不那么干净。我希望专家能给我带来正确的方向。感谢您的关注。
回答
我相信第一个实现更好,因为 self 可能在语句之间变为 nil
这就是为什么第二个实现实际上更好的原因!如果self在第一个语句中不是 nil,则第一个语句使它self 不能成为nil语句之间。它self完全保留块的其余部分。这就是所谓的“弱强之舞”。
guard let self = self else { return }
// ^^^^ this self is _strong_, not weak; it retains self
THE END
二维码