为什么Swift需要在super.init()之前初始化子类的属性

时间:2019-01-25 06:19:07

标签: swift

这里是问题,我想了解一下init是如何工作的,子类的属性存储在哪里

1 个答案:

答案 0 :(得分:0)

这里是一个示例,为了举例说明原因之一,假设您具有以下类定义:

class Base {
    init() {
        sayHello()
    }

    func sayHello() {
        print("Hello from base")
    }
}

class Derived: Base {
    let name: String

    override init() {
        // no initialization of own properties, just call super()
        super.init()
    }

    override func sayHello() {
        print("Hello from \(name)")
    }
}

基本上,基类的初始化调用sayHello,该方法在子类中被覆盖。现在,调用super.init()会导致覆盖方法被调用,这又需要使用name属性,该属性此时尚未初始化。

在调用super.init之前初始化所有子类存储的要求是为了确保对象有效性,然后再对它调用任何可能的操作。