结构不在新对象上调用 属性 观察者
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.
在这段代码中,我希望在创建新对象时调用 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.