一尘不染

Swift中willSet和didSet的作用是什么?

swift

Swift具有类似于C#的属性声明语法:

var foo: Int {
    get { return getFoo() }
    set { setFoo(newValue) }
}

但是,它也具有willSetdidSet动作。这些分别在设置器被调用之前和之后被调用。考虑到setter内可能只有相同的代码,它们的目的是什么?


阅读 335

收藏
2020-07-07

共1个答案

一尘不染

重点似乎是有时您需要一个具有自动存储
某些行为的属性,例如,通知其他对象该属性刚刚更改。当您只有get/时set,您需要另一个字段来保存值。使用willSetdidSet,可以在修改值时采取措施,而无需其他字段。例如,在该示例中:

class Foo {
    var myProperty: Int = 0 {
        didSet {
            print("The value of myProperty changed from \(oldValue) to \(myProperty)")
        }
    }
}

myProperty每次修改时都会打印其新旧值。仅使用getter和setter,我将需要以下内容:

class Foo {
    var myPropertyValue: Int = 0
    var myProperty: Int {
        get { return myPropertyValue }
        set {
            print("The value of myProperty changed from \(myPropertyValue) to \(newValue)")
            myPropertyValue = newValue
        }
    }
}

因此willSetdidSet代表了几行的经济性,并且字段列表中的噪音更少。

2020-07-07