2015-04-05 76 views
3

我有一个类属性与财产观察员。如果我在那类改变的东西,有没有触发didSet的方式例所示:在更改类中的属性时,有没有办法让didSet工作?

class Foo { 
    var items = [1,2,3,4,5] 
    var number: Int = 0 { 
     didSet { 
      items += [number] 
     } 
    } 
} 

var test: Foo = Foo() { 
    didSet { 
     println("I want this to be printed after changing number in test") 
    } 
} 

test.number = 1 // Nothing happens 

回答

6

什么也没有发生,因为观察者是test,这是一个富实例。但是您更改了test.number,而不是test本身。 Foo是一个类,一个类是一个引用类型,所以它的实例是可变的。

如果你想看到的日志信息,设置test本身为不同的值(例如不同的Foo())。

或者,println语句添加到其他didSet,你已经有了在Foo的number属性之一。或者,让Foo成为一个结构而不是一个类;更改结构属性确实替换结构,因为结构是一个值类型,而不是引用类型。

+1

当然...有时我想打我自己试图找到一个小时的答案,而我应该只使用一个结构......谢谢! – 2015-04-05 03:47:42

+0

您可能想看看我的书,我总结了值类型与参考类型行为之间的差异:http://www.apeth.com/swiftBook/ch04.html#SECreferenceTypes对“didSet”的响应结构体对struct结构属性的改变是我给出的第一个例子之一。 – matt 2015-04-05 04:35:58

相关问题