小编典典

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

all

问题

苹果的文档指定:

首次初始化属性时不会调用 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将永远被调用。我还没有决定这是否总体上更好,但它很适合我的情况。


阅读 70

收藏
2022-05-22

共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 将运行。

2022-05-22