2014-07-12 31 views
3

雨燕文档指出以下几点:斯威夫特:覆盖了方便与指定初始化

如果您正在覆盖初始化是一个方便的初始化, 您的覆盖必须调用另一个指定初始化从自己 子类,按照上面在初始化链接中描述的规则。

这意味着,当我定义具有相同签名作为从基类的一个convenience初始化的初始化,那么它必须也充当convenience初始化。我不能用designated初始化程序“覆盖”convenience初始值设定项。

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

  1. 那么,为什么他们添加了这个限制?
  2. 我该如何绕过它?也就是说,如果我确实需要一个与基类中便利初始值设定项相同签名的非便利初始值设定项,我该怎么办?我唯一的猜测就是添加一个未使用的虚拟参数来区分它们。但是,这似乎很哈克

回答

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 
+0

哦,这样的作品?精细!但是,那么我所引用的这句话是不是明显错了?或者在这种情况下,“重写”是指“调用初始化程序”而不是“具有相同的签名”? – gexicide