苹果的文档指定:
首次初始化属性时,不会调用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)