好的,所以我正在阅读如何在swift中使用willSet / didSet,我发现了一个关于苹果swift文档的说明,这对我没有任何意义,我希望有人可以解释。这是注释:
调用超类属性的willSet和didSet观察者 当在超类之后的子类初始值设定项中设置属性时 初始化程序已被调用。在课堂上不会打电话给他们 在超类初始化程序之前设置自己的属性 调用。
让我感到困惑的是,他们指出,在B到A的super.init调用之前,没有调用子类B中超类A属性的观察者。
class A {
var p: Bool
init() {
p = false
}
}
class B: A {
override var p: Bool {
didSet {
print("didSet p")
}
}
override init() {
p = true // Compiler error
super.init()
}
}
然而,从那时起A或B都无法访问该物业,所以无论如何谁会打电话给观察者呢?尝试读取/写入属性甚至会导致编译器错误,因此在Swift中甚至不可能错误地执行此操作。我错过了什么,或者这只是一个误导性的注释,指出错误的东西?
答案 0 :(得分:2)
他们正在谈论以下情景:
class A {
var p: Bool {
didSet {
print(">>> didSet p to \(p)")
}
}
init() {
p = false // here didSet won't be called
}
}
class B: A {
override init() {
// here you could set B's properties, but not those inherited, only after super.init()
super.init()
p = true // here didSet will be called
}
}
B()
将打印以下内容:
>>> didSet p to true
虽然对您而言似乎很自然,但文档必须明确记录此行为。