Swift:使用指定的初始化程序覆盖便利性

时间:2014-07-12 10:33:50

标签: constructor initialization swift override

Swift文档说明了以下内容:

  

如果您覆盖的初始化程序是一个便利初始化程序,   你的覆盖必须从它自己调用另一个指定的初始化程序   子类,根据上面在Initializer Chaining中描述的规则。

这意味着,当我使用与基类中的convenience初始化程序相同的签名定义初始值设定项时,它还必须充当convenience初始值设定项。我不能"覆盖"具有convenience初始值设定项的designated初始值设定项。

这对我来说似乎很尴尬:可能存在各种情况,其中签名(例如(String))仅是基类的便利init,而是子类的指定init。与方法相反,仅因为两个初始化程序具有相同的签名,它们不必执行类似的任务。 (String)的签名可能意味着子类完全不同。

  1. 那么,他们为什么要加上这个限制?
  2. 我怎样才能绕过它?即,如果我确实需要一个与基类中的便利初始化程序具有相同签名的非便利初始化程序,我该怎么办?我唯一的猜测是添加一个未使用的虚拟参数,仅用于区分它们。但这似乎非常hacky

1 个答案:

答案 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