2015-12-30 45 views
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!?) 
+1

看起來像一個錯誤。我認爲你可以通過刪除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

回答

0

沒有例外。我問到的行爲是一個錯誤。我已提交a bug report追蹤其進展的人。

相關問題