2014-07-12 124 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