【发布时间】:2015-06-15 02:47:27
【问题描述】:
我看了一个关于 swift 基础的教程,并且有一条评论说不能将属性观察器添加到惰性属性中,但没有给出任何理由。为什么会这样?
【问题讨论】:
我看了一个关于 swift 基础的教程,并且有一条评论说不能将属性观察器添加到惰性属性中,但没有给出任何理由。为什么会这样?
【问题讨论】:
文档确实证实了这一点:
除了惰性存储属性之外,您可以将属性观察器添加到您定义的任何存储属性中
但他们没有提供理由。
我猜想属性观察者必须访问他们正在观察的属性才能将自己附加为观察者,尽管它不像你那样“感觉”。同样,这只是一个猜测,但如果我是正确的,那么显然拥有惰性属性是无关紧要的。惰性属性是在第一次访问时计算的,如果使用观察者访问该属性,那么它将立即计算,这首先完全违背了它的目的。
【讨论】:
final class A {
init() {
print("!")
}
}
final class B {
lazy var a = A()
}
B().a = A()
你只会得到一个“!”作为这里的输出。我的猜测是,在这里允许didSet 会使这种情况变得更加复杂。
【讨论】:
在 Swift 5.3 中,您现在可以使用惰性属性观察器。它使我们可以在不分配任何默认值的情况下声明属性。 (https://www.swiftbysundell.com/tips/lazy-property-observers/)
lazy var totalSteps: Int = 0{
willSet(newTotalSteps) {
print("About to set totalSteps to \(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
print("Added \(totalSteps - oldValue) steps")
}
}
}
【讨论】: