在Swift中,当从init()方法中调用时,didSet不会被触发。

47

我有一辆车和一个司机。他们相互引用。在车的init()方法中,我创建一个司机并将其分配给司机成员。司机成员有一个didSet方法,应该设置司机的汽车,从而相互链接。

class GmDriver {
    var car: GmCar! = nil
}

class GmCar {
    var driver: GmDriver {
        didSet {
            driver.car = self
        }
    }
    init() {
        driver = GmDriver()
    }
}

let myCar = GmCar()
println(myCar.driver.car) // nil

然而,didSet从未触发。为什么呢?


15
属性观察者在初始化期间不会被调用,详情请参见 https://dev59.com/V18e5IYBdhLWcg3w6d4_ - Martin R
2
谢谢!缺少苹果的文档和搜索stackoverflow真的应该让我失去声望... - uaknight
@MartinR,请将其添加为答案,好吗? - Dan Rosenstark
2个回答

51

苹果文档:

当在子类初始化器中设置属性时,在调用超类初始化器之后,将调用超类属性的willSet和didSet观察器。在调用超类初始化器之前,它们不会在类设置自己的属性时被调用。


3
init() {
    defer {
        driver = GmDriver()
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接