我得到了以下代码:
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中看到的那样),我将无法使其正常工作。
答案 0 :(得分:1)
可解码强制超级开放类实现初始化程序
如果您不继承必需的初始化器,那么超类必须自己实现。
在定义类初始化器之前写所需的修饰符,以指示该类的每个子类都必须实现该初始化器:<..>
还必须在所需的初始化程序的每个子类实现之前编写所需的修饰符,以指示初始化程序要求适用于链中的其他子类。
如果可以通过继承的初始化程序满足要求,则不必提供所需的初始化程序的显式实现。
如何避免自己实施:
规则1
如果您的子类未定义任何指定的初始值设定项,它将自动继承其所有超类的指定的初始值设定项。