在更改类中的属性时,有没有一种方法可以使didSet起作用?

8

我有一个作为属性的类,带有属性观察器。如果我更改该类中的某些内容,是否有一种方法可以触发类似于示例中的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
1个回答

11

由于观察者位于test上,它是一个Foo实例,所以什么也没有发生。但是你已经改变了test.number而不是test本身。Foo是一个类,类是引用类型,因此其实例可以在原地可变。

如果你想要看到日志消息,请将test 本身设置为一个不同的值(例如不同的Foo())。

或者,在另一个已经存在于Foo的number属性中的其他didSet中添加println语句。

或者,将Foo变成一个结构体而不是类;更改结构体属性会替换结构体,因为结构体是值类型,而不是引用类型。


2
当然...有时候我会想打自己,因为我花了几个小时去寻找答案,而我本应该只是使用一个结构体...谢谢! - Henny Lee
1
你可能想看一下我的书,我在其中总结了值类型和引用类型行为差异的内容:http://www.apeth.com/swiftBook/ch04.html#SECreferenceTypes。我给出的第一个示例是对结构体引用中`didSet`响应结构体属性更改的说明。 - matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接