2

在这段代码中,我想在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
4

3 回答 3

2

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

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 
于 2018-06-02T12:30:52.180 回答
1

在初始化程序中不调用属性观察者是故意的。考虑下面的代码;如果将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

于 2018-06-02T13:10:35.530 回答
1

那是因为第一个是实例创建——你没有像名字所暗示的那样设置属性。如果您需要在创建实例时发生某些事情,只需在 init 方法中执行,如下所示:

struct MyStruct {
    init(myValue: Int) {
        self.myValue = myValue
        doSomething()
    }
}
于 2018-06-02T12:29:14.830 回答