可分解的力量超级开放类实现初始化程序

时间:2018-08-31 20:57:06

标签: swift decodable

我得到了以下代码:

open class A: Decodable {
    public init() {

    }
}

open class B: A {
    public override init() {
        super.init()
    }

    open required init(from decoder: Decoder) throws {
        fatalError("init(from:) has not been implemented")
    }
}

万能的Xcode 9.4.1告诉我,在需要关键字之前,我需要将open更改为public。将open更改为public后,编译器告诉我需要将其更改为open。在两个类都是open的情况下,如果没有我的超类A显式实现所需的初始化程序(如在类B中看到的那样),我将无法使其正常工作。

1 个答案:

答案 0 :(得分:1)

  

可解码强制超级开放类实现初始化程序

如果您不继承必需的初始化器,那么超类必须自己实现。

必需的初始化器

  

在定义类初始化器之前写所需的修饰符,以指示该类的每个子类都必须实现该初始化器:<..>

     

还必须在所需的初始化程序的每个子类实现之前编写所需的修饰符,以指示初始化程序要求适用于链中的其他子类。

     

如果可以通过继承的初始化程序满足要求,则不必提供所需的初始化程序的显式实现。

如何避免自己实施:

初始化器继承

  

规则1

     

如果您的子类未定义任何指定的初始值设定项,它将自动继承其所有超类的指定的初始值设定项。

来源