Swift 属性 观察不会覆盖

Swift property observing doesn't override

我写了 class 继承和 属性 覆盖。我发现存储 属性 观察不像其他覆盖那样工作。

这些classes已经存储了属性并计算了属性用于比较。

class Parent {
    var storedProp : Int! {
        didSet {
            print("Parent stored property didSet")
        }
    }
    var calcProp : Int {
        print("Parent calculated property get")
        return 100
    }
}

class Child : Parent {
    override var storedProp : Int! {
        didSet {
            print("Child stored property didSet")
        }
    }

    override var calcProp : Int {
        print("Child calculated property get")
        return 101
    }
}

当我实例化 Child object 并计算 属性 时。 child class 中的 属性 覆盖并且不工作 parent。

var obj = Child()
let value = obj.calcProp

我预计 属性 观察会发生同样的事情,但是 属性 观察 child 和 parent 都有效。它看起来像传播。

obj.storedProp = 999

// Parent stored property didSet
// Child stored property didSet

它是有意的吗?..我怎样才能防止传播?

属性 观察者观察并响应 属性 值的变化。有两个观察者 willSetdidSet没有观察者获得 属性(即没有 willGet 也没有 didGet)。

在您的 calcProp 属性 定义中,您覆盖了 get 计算的 属性 而不是 (non-existant) didGet 属性 观察者。您从 child 获取值的调用仅调用 child 的 属性 上的 get 方法。 child 和 parent 都没有观察到 get。

为了防止您看到的效果:设置 属性 时,您应该实施 set 计算 属性。如果您不希望它观察该值的变化 ,则必须从 parent 中删除 didSet 观察者,即使变化源自 child.

Swift 编程语言 (Swift 2.2) 的

Inheritance 部分将 'overriding property observers' 描述为 'adding property observers'

Overriding Property Observers

You can use property overriding to add property observers to an inherited property...

如果 subclass 能够在以下示例中覆盖 currentSpeed 属性 或 AutomaticCar class 的 didSet 观察者:

class AutomaticCar {
    var currentSpeed: Double {
        didSet {
            gear = Int(currentSpeed / 10.0) + 1
        }
    }
}

subclass 中的 didSet 会阻止更新 gear 属性,这可能会破坏超级 class、AutomaticCar 的设计行为。