什么时候应该 属性 观察者 运行?有哪些例外情况?
When should property observers run? What are the exceptions?
属性 观察者在以下情况下的行为让我感到惊讶。我知道观察者不会递归地调用自己,但这种行为似乎会延续到同一 class 的不同实例,甚至是不同子 classes.
的实例
据我了解,属性 观察者 运行 任何时候 属性 被设置,即使值没有改变,除了初始化。该规则的例外情况到底是什么? 属性 观察者究竟何时会被忽略,如下所示?
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!?)
无一例外。我询问的行为是一个错误。我已经为跟踪其进度的人提交了 a bug report。
属性 观察者在以下情况下的行为让我感到惊讶。我知道观察者不会递归地调用自己,但这种行为似乎会延续到同一 class 的不同实例,甚至是不同子 classes.
的实例据我了解,属性 观察者 运行 任何时候 属性 被设置,即使值没有改变,除了初始化。该规则的例外情况到底是什么? 属性 观察者究竟何时会被忽略,如下所示?
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!?)
无一例外。我询问的行为是一个错误。我已经为跟踪其进度的人提交了 a bug report。