Swift属性观察不会覆盖

时间:2016-08-30 05:14:07

标签: ios swift properties override

我用属性覆盖编写了类继承。我发现存储属性观察不像其他覆盖一样。

这些类具有用于比较的存储属性和计算属性。

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对象并获得计算属性时。子类中的属性覆盖并且不适用于父类。

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

我预计在物业观察上会发生同样的事情,但是孩子和父母的财产观察都有效。它看起来像传播。

obj.storedProp = 999

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

是否有意??我如何防止传播?

2 个答案:

答案 0 :(得分:1)

物业观察员观察并回应物业价值的变化。有两位观察员willSetdidSet没有观察员获取财产(即没有willGet而没有didGet)。

calcProp属性定义中,您已覆盖get 计算属性而不是(不存在的)didGet属性观察者。您从孩子那里获得价值的电话只会调用孩子的财产上的get方法。孩子和父母都没有观察到这一点。

要防止您看到的效果:设置属性时,您应该实现set计算属性。您必须从父母那里移除didSet观察员,如果您不想观察该值的变化,即使更改源自孩子

答案 1 :(得分:0)

Swift编程语言(Swift 2.2)的

Inheritance部分将“覆盖属性观察者”描述为“添加属性观察者”

  

覆盖财产观察员

     

您可以使用属性覆盖将属性观察者添加到   继承财产......

如果子类能够覆盖以下示例中didSet类的currentSpeed属性的AutomaticCar观察者:

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

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