【问题标题】:Overriding superclass initializer in Swift在 Swift 中重写超类初始化器
【发布时间】:2017-10-26 12:04:14
【问题描述】:

我找到了许多在 Swift 3 中使用单例模式的示例。我正在尝试使用这种方法:

class Records: RailsData {
    static let shared = Records()
    private init() {} 
    ...
}

当我这样做时,我得到编译器错误:

覆盖声明需要一个“覆盖”关键字

当我添加 override 关键字时,它会编译并且一切似乎都可以正常工作。是否需要覆盖,因为我正在继承 RailsDataRailData 是一个抽象类,因为它不是直接实例化的。我也没有把它变成一个单例

我正在尝试通过使用override 修饰符来确保我以后不会被咬...

【问题讨论】:

    标签: swift compiler-errors singleton overriding initializer


    【解决方案1】:

    您没有做错任何事;)override 修饰符是必需的,因为您的RailsData 超类声明了一个指定初始化程序,其中精确 em> 相同的签名:

    class RailsData {
        init() {...}
        ...
    }
    

    因此,override 修改在您的子类中是必需的。同样的事情也适用于继承的方法。来自The Swift Programming Language book

    当您编写与超类指定初始化程序匹配的子类初始化程序时,您实际上是在提供对该指定初始化程序的覆盖。因此,您必须在子类的初始化程序定义之前编写 override 修饰符。即使您要覆盖自动提供的默认初始化程序也是如此。

    与重写的属性、方法或下标一样,override 修饰符的存在会提示 Swift 检查超类是否有匹配的指定初始化程序被重写,并验证重写初始化程序的参数是否已按预期指定。

    放心,以后你不会被这个咬的;)


    激励示例。要查看此初始化器覆盖的实际效果,请尝试以下示例:

    class SuperClass {
        init(x: Int) {
            print("3. SuperClass.init(x: \(x))")
        }
        convenience init() {
            print("1. SuperClass.init()")
            self.init(x: 123) // Will be overridden by subclass.
        }
    }
    
    class SubClass: SuperClass {
        override init(x: Int) {
            print("2. SubClass.init(x: \(x))")
            super.init(x: x)
            print("4. SubClass.init(x: \(x))")
        }
    }
    
    // Calls inherited convenience initializer.
    let sub = SubClass() 
    

    输出:

    1. SuperClass.init()
    2. SubClass.init(x: 123)
    3. SuperClass.init(x: 123)
    4. SubClass.init(x: 123)

    抽象类。顺便说一句,在SwiftObjective-C 中没有对抽象类 的直接语言支持,但至少在Cupertino is thinking about it ;) 目前,这样的概念只是一个 soft 框架作者等使用的约定。

    【讨论】:

      【解决方案2】:

      要添加到@Paulo Matteo 的综合答案,这很可能是您需要的修复:

      override private init() {
          super.init()
      }
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多