2016-11-23 51 views
0

當涉及到Swift類時,我需要初始化程序和委託初始化程序之間有點混淆。Swift - 必需的初始化程序與委託初始化程序之間的一點混淆

正如你可以在我的例子代碼中看到的,NewDog可以用2種方式中的1種進行初始化。正如你所看到的,你可以通過初始化時提供初始化來初始化,在這種情況下,默認名稱將被分配(「好友」)。

我不明白的是爲什麼NewDog類需要初始值設定項所需的關鍵字,如果初始化程序甚至沒有被使用?請參閱.. var georgie正在使用常規初始化程序(不是NewDog中必需的初始化程序)並且它工作得很好。

那麼它是什麼需要,如果它是...其實..不是必需的? *如果我拿走那個初始化器,編譯器就會大聲說「必需」初始化器'init'必須由'Dog''的子類提供。

嗯好的......我把它放回去......但是我不必使用它,因爲NewDog中的第一個初始化器實現了所有的成員屬性初始化......我沒有看到邏輯在這裏。

class Dog { 
    var name : String 
    required init(_ name: String) { 
     self.name = name 
    } 
} 

class NewDog: Dog { 
    var age : Int? 
    init(age: Int, name: String) { 
     super.init(name) 
     self.age = age 
    } 

    required init(_ name: String) { 
     super.init(name) 
    } 
} 

var georgie = NewDog(age: 6, name: "Georgie") 
georgie.age 

那麼有人可以向我解釋什麼是必需的關鍵字是什麼?我的猜測是,它只是告訴編譯器「嘿......冷靜下來...... name屬性將在我們的子類中初始化,因爲你在大聲喊我要求它...所以只需放鬆一下,我就會處理它在我自己的。我打算做一個明確的子類初始化,我創建自己「...

*****也!獎金問題:NewDog中的哪個初始化程序是指定初始化程序?

感謝

回答

1

一個required初始化意味着每個子類必須實現相同的初始化。由於您創建了Dog類中所需的init(_:)初始值設定項,因此Dog的每個子類(及其子類)也必須提供相同的required init(_:)初始值設定項。

從外觀看,您不需要在Dog類中設置init(_:)初始值設定項。刪除該關鍵字,然後您可以從NewDog類中刪除init(_:)初始值設定項。

獎勵 - 您的NewDog類中的init方法都是指定的初始值設定項,因爲它們都不是方便初始值設定項。

您需要了解默認值,便利性和所需初始值設定項的區別和用法。這全部在The Swift Programming Language書的Intializers部分清楚地涵蓋。

+0

我只是在指定和要求之間的差異而感到困惑。不過謝謝。此外,Dog類中所需的init是用於多元語用的目的。製作了一個採用Dog類型並初始化並返回新實例的工廠。由於它採用了Dog類型,因此需要讓編譯器知道我可能正在傳遞Dog類型的子類,所以它不會讓我大失所望。 – user7024499

+0

所以,true或false ......用你的話來說,必須意味着「每個子類都必須實現相同的初始化器」,但是......並不意味着子類必須使用該初始化器。正如我上面的示例所顯而易見的,該實例是使用不同的指定初始化程序創建的。 – user7024499

+0

確實,「必需」表示它必須存在。這並不意味着它必須被使用。 – rmaddy