簡體   English   中英

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

[英]Swift: Overriding a convenience with a designated initializer

Swift文檔說明了以下內容:

如果要覆蓋的初始化程序是一個便捷初始化程序,則根據上面在初始化程序鏈中描述的規則,您的覆蓋必須從其自己的子類中調用另一個指定的初始化程序。

這意味着,當我使用與基類中的convenience初始化程序相同的簽名定義初始化程序時,它也必須充當convenience初始化程序。 我不能用designated初始化程序“覆蓋” convenience初始化程序。

這對我來說似乎很尷尬:可能存在簽名的各種情況,例如(String)只是基類的便利init,而是子類的指定init。 與方法相反,僅因為兩個初始化程序具有相同的簽名,它們不必執行類似的任務。 (String)簽名可能意味着子類完全不同。

  1. 那么,他們為什么要加上這個限制呢?
  2. 我怎么能繞過它呢? 即,如果我確實需要一個與基類中的便利初始化程序具有相同簽名的非便利初始化程序,我該怎么辦? 我唯一的猜測是添加一個未使用的虛擬參數,僅用於區分它們。 但這似乎非常hacky

它們的含義是,如果覆蓋的初始化程序是便捷初始化程序,則必須遵循Initialiser Chaining。

以下工作正常意味着您可以使用指定的初始化器覆蓋便利初始化器:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM