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
它是有意的吗?..我怎样才能防止传播?
属性 观察者观察并响应 属性 值的变化。有两个观察者 willSet
和 didSet
。 没有观察者获得 属性(即没有 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 的设计行为。
我写了 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
它是有意的吗?..我怎样才能防止传播?
属性 观察者观察并响应 属性 值的变化。有两个观察者 willSet
和 didSet
。 没有观察者获得 属性(即没有 willGet
也没有 didGet
)。
在您的 calcProp
属性 定义中,您覆盖了 get
计算的 属性 而不是 (non-existant) didGet
属性 观察者。您从 child 获取值的调用仅调用 child 的 属性 上的 get
方法。 child 和 parent 都没有观察到 get。
为了防止您看到的效果:设置 属性 时,您应该实施 set
计算 属性。如果您不希望它观察该值的变化 ,则必须从 parent 中删除 didSet
观察者,即使变化源自 child.
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 的设计行为。