在闭包中,`self?` 和 `guard let self` 是一样的吗?

Are `self?` and `guard let self` the same, in a closure?

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

来自:

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? 在它调用的变量为 nil 时被释放。或者是第二种方法,使用 guard let self,100% 确保 self 被释放的方法?谢谢

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

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