【问题标题】:Why does Swift need to initialized subclass's property before super.init()为什么 Swift 需要在 super.init() 之前初始化子类的属性
【发布时间】:2019-01-25 06:19:07
【问题描述】:

问题来了,我想知道init是如何工作的,子类的属性存储在哪里

【问题讨论】:

    标签: swift


    【解决方案1】:

    这里有一个例子,举例说明其中一个原因,假设您有以下类定义:

    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之前初始化所有子类存储的要求是在调用任何可能的操作之前确保对象的有效性。

    【讨论】:

      猜你喜欢
      • 2020-07-06
      • 2014-10-09
      • 2021-12-22
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 2014-07-24
      相关资源
      最近更新 更多