我用属性覆盖编写了类继承。我发现存储属性观察不像其他覆盖一样。
这些类具有用于比较的存储属性和计算属性。
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
是否有意??我如何防止传播?
答案 0 :(得分:1)
物业观察员观察并回应物业价值的变化。有两位观察员willSet
和didSet
。 没有观察员获取财产(即没有willGet
而没有didGet
)。
在calcProp
属性定义中,您已覆盖get
计算属性而不是(不存在的)didGet
属性观察者。您从孩子那里获得价值的电话只会调用孩子的财产上的get
方法。孩子和父母都没有观察到这一点。
要防止您看到的效果:设置属性时,您应该实现set
计算属性。您必须从父母那里移除didSet
观察员,如果您不想观察该值的变化,即使更改源自孩子。
答案 1 :(得分:0)
Inheritance部分将“覆盖属性观察者”描述为“添加属性观察者”
覆盖财产观察员
您可以使用属性覆盖将属性观察者添加到 继承财产......
如果子类能够覆盖以下示例中didSet
类的currentSpeed
属性的AutomaticCar
观察者:
class AutomaticCar {
var currentSpeed: Double {
didSet {
gear = Int(currentSpeed / 10.0) + 1
}
}
}
子类中的didSet
会阻止更新gear
属性,这可能会破坏超类AutomaticCar的设计行为。