我们是否需要在每个嵌套闭包中重复“guard let self = self else { return }”以保持强大的 self ?

pvl*_*spk 13 swift

我需要在内心深处保持坚强的自我。我知道[weak self]对于外部封闭来说只声明一次就足够了。

但是guard let self = self else { return },对于外部封闭也声明一次就足够了吗?我们这里有什么边缘情况吗?

  apiManager.doSomething(user: user) { [weak self] result in
            guard let self = self else { return }

            self.storageManager.doSomething(user: user) { result in
                // guard let self = self else { return } <- DO WE NEED IT HERE ?
                self.doSomething()
            }
        }
Run Code Online (Sandbox Code Playgroud)

似乎语言分析器说“没有一个声明就足够了”,但想确定一下。

Sch*_*tFx 17

更新斯威夫特 5.7

当该方法同步工作时,您不需要在 中添加新的保护doSomething(user:)。使用 Swift 5.7,您可以使用重写语法guard let self else

apiManager.doSomething(user: user) { [weak self] result in
  guard let self else { return }

  self.storageManager.doSomething(user: user) { result in
      // You don't a new guard here, when doSomething works synchronously
      self.doSomething()
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,当你guard唯一返回时,你也可以这样写:相同的行为。

apiManager.doSomething(user: user) { [weak self] _ in
  self?.storageManager.doSomething(user: user) { _ in
      self?.doSomething()
  }
}
Run Code Online (Sandbox Code Playgroud)


And*_*jen 14

是的,一个就够了。如果你写

guard let self = self else { return }
Run Code Online (Sandbox Code Playgroud)

您将创建一个新的局部变量,它将保留对外部弱自身的强引用。

和写作是一样的

guard let strongSelf = self else { return }
Run Code Online (Sandbox Code Playgroud)

然后用于strongSelf该块的其余部分。

  • 从 Swift 5.8 开始,有两个额外的简化:1. 现在可以编写 `guard let self else { return }`,2. 不需要在闭包内显式编写 `self.`。也许值得编辑(?) (3认同)