2015-12-30 69 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追踪其进展的人。