Swift文档说明了以下内容:
如果您覆盖的初始化程序是一个便利初始化程序, 你的覆盖必须从它自己调用另一个指定的初始化程序 子类,根据上面在Initializer Chaining中描述的规则。
这意味着,当我使用与基类中的convenience
初始化程序相同的签名定义初始值设定项时,它还必须充当convenience
初始值设定项。我不能"覆盖"具有convenience
初始值设定项的designated
初始值设定项。
这对我来说似乎很尴尬:可能存在各种情况,其中签名(例如(String)
)仅是基类的便利init,而是子类的指定init。与方法相反,仅因为两个初始化程序具有相同的签名,它们不必执行类似的任务。 (String)
的签名可能意味着子类完全不同。
答案 0 :(得分:3)
他们的意思是,如果您>>覆盖后的初始化者是便利初始化者,那么您必须遵循初始化链接。
以下工作正常意味着您可以使用指定的初始化程序覆盖便利初始化程序:
class Base {
var x = 0
init() {}
convenience init(_: Int) {
self.init()
self.x = 5
}
}
class Derived : Base {
init() {}
init(_: Int) {
super.init()
self.x = 10
}
}
var i = Derived(1) // x = 10