结构不在新对象上调用 属性 观察者

Struct not calling property observers on new object

在这段代码中,我希望在创建新对象时调用 property observers。我该如何实现?

这是我目前的情况:

struct MyStruct {
    var myValue: Int {
        willSet {
            print("willSet")
        }
        didSet {
            print("didSet")
        }
    }
}

var abc = MyStruct(myValue: 3) // Does not use property observers
abc.myValue = 5 // Calls property observers

那是因为第一个是实例 creation - 你不会 set 属性 顾名思义。如果您需要在创建实例时发生某些事情,只需在 init 方法中执行,如下所示:

struct MyStruct {
    init(myValue: Int) {
        self.myValue = myValue
        doSomething()
    }
}

您可以按如下方式构造自定义初始化器。

struct MyStruct {
    var myValue: Int {
        willSet {
            print("willSet")
        }
        didSet {
            print("didSet")
        }
    }

    init(value: Int) {
        myValue = value
        // print something here
    }
}

var abc = MyStruct(value: 3) 
abc.myValue = 5 

属性 观察者不在初始化器中调用是有意的。考虑下面的代码;如果此 struct 成为其实例,程序将崩溃。那是因为观察者在设置之前访问其他属性。正因为如此,它被选择没有来自初始化器的观察者运行。

struct Struct {

    var p1: Int { didSet { p2 = p3 * 2 } }
    var p2: Int { didSet { p1 = p3 / 2 } }
    var p3: Int

    init(_ p1: Int, _ p2: Int, _ p3: Int) {
        self.p1 = p1 // The program crashes at this point, because `p3` was not yet set.
        self.p2 = p2
        self.p3 = p3
    }
}

为了避免这种情况,您可以创建一个从观察者和初始化器调用的函数,或者您可以查看 this.