【问题标题】:Are `self?` and `guard let self` the same, in a closure? [duplicate]`self?` 和 `guard let self` 在闭包中是否相同? [复制]
【发布时间】:2021-09-29 01:51:54
【问题描述】:

代码审查中要求我进行此更新。

来自:

func bind(errorText: Driver<String>) {
         errorText.drive(onNext: { [weak self] text in
             self?.set(text: text)
             self?.accessibilityValue = text
         }).disposed(by: disposeBag)
     }

到:

func bind(errorText: Driver<String>) {
         errorText.drive(onNext: { [weak self] text in
             guard let self = self else { return }
             self.set(text: text)
             self.accessibilityValue = text
         }).disposed(by: disposeBag)
     }

区别在于self?guard

在第一个代码中,我的印象是self? 在它调用的变量为零时被释放。还是第二种方式,使用guard let self,100% 确保self 被释放?谢谢

【问题讨论】:

  • 我个人喜欢给它加点趣味,并将守卫命名为strongSelf,以便更容易在视觉上看到该块被强引用。只是我的 2c

标签: ios swift xcode closures self


【解决方案1】:

这些实际上是相同的。主要区别在于第一个将检查 self 是否为 nil 两次而不是一次。由于第一个示例没有跨语句的强引用,因此技术上可以执行第一行,然后释放self,而第二行不执行。在第二种情况下,guard let 采用强引用直到块结束,此时self 将被释放。

后者通常更可取,尽管这不是一个大问题。当self 为nil 时,更容易推断guard let 代码。当您使用self?. 跳过一堆语句时,任何 依赖self 的行仍然会执行,这可能会令人惊讶。在不适合可选链接的情况下(例如访问self 的属性时)也很好。所以在更多情况下它的工作方式相同。

【讨论】:

  • Rob,您第二段中关于guard let 代码的部分令人困惑,并且所写的内容给我留下了错误的印象。当你在闭包的开头使用guard let... 时,如果 self 为 nil,闭包将退出,并且不依赖于 self 的附加行将 not 执行。 (如果 self 为 nil,guard let 之后的任何内容都不会执行。)
  • 感谢@DuncanC。希望以更清晰的方式重新措辞。
猜你喜欢
  • 1970-01-01
  • 2022-09-30
  • 1970-01-01
  • 2018-08-30
  • 2018-10-11
  • 2021-04-08
  • 2015-01-17
  • 2015-07-02
  • 2016-05-02
相关资源
最近更新 更多