调用super.init之前未调用的Swift变量观察器

时间:2018-01-22 23:28:35

标签: swift observers didset

好的,所以我正在阅读如何在swift中使用willSet / didSet,我发现了一个关于苹果swift文档的说明,这对我没有任何意义,我希望有人可以解释。这是注释:

  

调用超类属性的willSet和didSet观察者   当在超类之后的子类初始值设定项中设置属性时   初始化程序已被调用。在课堂上不会打电话给他们   在超类初始化程序之前设置自己的属性   调用。

来自:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html

让我感到困惑的是,他们指出,在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中甚至不可能错误地执行此操作。我错过了什么,或者这只是一个误导性的注释,指出错误的东西?

1 个答案:

答案 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

虽然对您而言似乎很自然,但文档必须明确记录此行为。