在闭包中,`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
的属性时)也很好。所以在更多情况下都是一样的。
代码审查要求我进行此更新。
来自:
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
的属性时)也很好。所以在更多情况下都是一样的。