一尘不染

是否可以允许在Swift初始化期间调用didSet?

swift

苹果的文档指定:

首次初始化属性时,不会调用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函数中的属性。有没有办法在初始化过程中强制此调用?

更新资料

我决定只为我的类删除便捷的初始化器,并强迫您在初始化后设置属性。这使我知道didSet将永远被调用。我还不确定总体上是否更好,但这很适合我的情况。


阅读 423

收藏
2020-07-07

共1个答案

一尘不染

创建一个自己的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将运行。

2020-07-07