Swift Decodable强制超开放类实现初始值设定项
我得到了这个密码:Swift Decodable强制超开放类实现初始值设定项,swift,decodable,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 implement
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
。如果没有我的超级类A显式地实现类B中所需的初始值设定项,那么当两个类都打开时,我就无法让它工作。为什么
Decodable强制超开放类实现初始值设定项
如果您没有继承超类所需的初始值设定项,那么您必须自己实现它
必需的初始值设定项
在类初始值设定项的定义之前写入所需的修饰符,以指示类的每个子类都必须实现该初始值设定项:
您还必须在所需初始值设定项的每个子类实现之前写入所需的修饰符,以指示初始值设定项要求适用于链中的其他子类
如果可以使用继承的初始值设定项满足要求,则不必提供所需初始值设定项的显式实现
如何避免自己实施它:
初始值设定项继承
规则1
如果您的子类没有定义任何指定的初始值设定项,它将自动继承其所有超类指定的初始值设定项
来源
Codable
不支持继承。@vadian-Hmm,但是如果两个类都是公共的,那么这对初始值设定项有什么关系?B类知道它有一个超级类。我不明白为什么它不适用于开放类。看起来像是超类中合成的init(from:)
的bug——它在Swift 4.2(使用Xcode 10 beta 6)中得到了修复,在子类中使用public required init
可以编译代码。为什么否决?如上所述,这是编译器中的一个bug,对此我能做些什么?