2
在以下情况下,属性观察者的行为让我感到惊讶。我明白观察者不会递归地调用自己,但是这种行为似乎继承了同一类的不同实例,甚至是不同子类的实例。属性观察者何时应该运行?什么是例外?
据我所知,属性观察者在任何时候都会运行一个属性,即使这个值没有改变,除了初始化。这个规则的例外究竟是什么?如何看待财产观察员究竟会被忽略?
var observersCalled = 0
class ClassOne {
var relatedOne: ClassOne?
var relatedTwo: ClassTwo?
var property: String = "Initial" {
didSet {
observersCalled += 1
relatedOne?.property = property
relatedTwo?.property = property
}
}
}
class ClassTwo {
var property: String = "Initial" {
didSet {
observersCalled += 1
}
}
}
class Subclass: ClassOne {
override var property: String {
didSet {
observersCalled += 1
}
}
}
let thing = ClassOne()
thing.relatedOne = ClassOne()
thing.property = "New Value"
print(observersCalled) //1 (really?)
observersCalled = 0
thing.relatedOne = nil
thing.relatedTwo = ClassTwo()
thing.property = "Another Value"
print(observersCalled) //2 (makes sense)
observersCalled = 0
thing.relatedOne = Subclass()
thing.relatedTwo = nil
thing.property = "Yet Another Value"
print(observersCalled) //1 (really!?)
看起来像一个错误。我认为你可以通过删除ClassTwo和Subclass以及相关的演示来改进测试用例。另外,我会在ClassOne上添加一个bool属性(默认为false),并在didSet观察器中将其设置为true。然后打印(“thing run didSet:\(thing.didSetExecuted)[expected true]”)和print(“thing.related ran didSet:\(thing.relatedOne?.didSetExecuted)[expected true]”)。然后通过https://bugs.swift.org提交bug – adpalumbo