Swift 文档说明如下:
If the initializer you are overriding is a convenience initializer, your override must call another designated initializer from its own subclass, as per the rules described above in Initializer Chaining.
这意味着,当我从基类定义一个与 convenience
初始化器具有相同签名的初始化器时,它也必须充当 convenience
初始化器。我不能用 designated
初始值设定项“覆盖” convenience
初始值设定项。
这对我来说似乎很尴尬:可能有多种情况,其中签名,例如 (String)
只是基类的便利初始化,但是子类的指定初始化。与方法相反,仅仅因为两个初始化器具有相同的签名,它们不必执行相似的任务。 (String)
的签名对于子类可能意味着完全不同的东西。
- 那么,他们为什么要添加此限制?
- 我该如何规避它?也就是说,如果我确实需要一个与基类中的便利初始化程序具有相同签名的非便利初始化程序,我应该怎么做?我唯一的猜测是添加一个未使用的虚拟参数只是为了区分它们。但这看起来很老套
最佳答案
他们的意思是,如果您在之后覆盖的初始化器是一个方便的初始化器,那么您必须遵循初始化器链。
以下工作正常意味着您可以使用指定的初始化器覆盖便利初始化器:
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
关于constructor - Swift:使用指定的初始化程序覆盖便利,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24712047/