我得到了这个代码:
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 所示。
Decodable 强制超级开放类来实现初始值设定项
如果您没有继承超类所需的初始值设定项,则必须自己实现它。
必需的初始值设定项
在类初始值设定项的定义之前编写所需的修饰符,以指示类的每个子类都必须实现该初始值设定项:<..>
还必须在所需初始值设定项的每个子类实现之前编写所需的修饰符,以指示初始值设定项要求适用于链中的其他子类。
如果可以使用继承的初始值设定项满足要求,则不必提供所需初始值设定项的显式实现。
如何避免自己实现它:
初始值设定项继承
规则1
如果子类未定义任何指定的初始值设定项,则它会自动继承其所有超类指定的初始值设定项。
来源
- 初始化 #Required 初始值设定项
- 初始化 #Automatic 初始值设定项继承