苹果的文档指定:
首次初始化属性时不会调用 willSet 和 didSet 观察者。仅当属性的值设置在初始化上下文之外时才调用它们。
是否可以在初始化期间强制调用这些?
假设我有这门课
class SomeClass { var someProperty: AnyObject { didSet { doStuff() } } init(someProperty: AnyObject) { self.someProperty = someProperty doStuff() } func doStuff() { // do stuff now that someProperty is set } }
我创建了 method doStuff,以使处理调用更简洁,但我宁愿只处理didSet函数中的属性。有没有办法在初始化期间强制调用它?
doStuff
didSet
我决定只删除我的类的便利初始化程序,并强制您在初始化后设置属性。这让我知道didSet将永远被调用。我还没有决定这是否总体上更好,但它很适合我的情况。
创建一个自己的 set-Method 并在您的 init-Method 中使用它:
class SomeClass { var someProperty: AnyObject! { didSet { //do some Stuff } } init(someProperty: AnyObject) { setSomeProperty(someProperty) } func setSomeProperty(newValue:AnyObject) { self.someProperty = newValue } }
通过声明someProperty为 type: AnyObject!(隐式展开的可选),您允许 self 完全初始化而不 someProperty被设置。当您调用时, setSomeProperty(someProperty)您调用的是 self.setSomeProperty(someProperty). 通常你不能这样做,因为 self 还没有完全初始化。由于 someProperty不需要初始化并且您正在调用依赖于 self 的方法,因此 Swift 会离开初始化上下文并且 didSet 将运行。
someProperty
AnyObject!
setSomeProperty(someProperty)
self.setSomeProperty(someProperty)