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