在闭包中,“self?”和“guard let self”是否相同?

bru*_*uno 1 xcode closures self ios swift

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

从:

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

到:

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)
     }
Run Code Online (Sandbox Code Playgroud)

区别在于self?和 之间guard

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

Rob*_*ier 6

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

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


归档时间:

查看次数:

925 次

最近记录:

4 年,4 月 前