在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


以上是在Swift中,如果我有一个捕获[weakself]的闭包,在闭包的开头解开可选的self是一种好习惯吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>