2014-07-02 56 views
37

我有以下類,有一個init方法:斯威夫特子類 - 如何重寫的init()

class user { 
    var name:String 
    var address:String 

    init(nm: String, ad: String) { 
    name = nm 
    address = ad 
    } 
} 

我想此類子類,但我一直在super.init()部分得到錯誤:

class registeredUser : user { 
    var numberPriorVisits: Int 

    // This is where things start to go wrong - as soon as I type 'init' it 
    // wants to autocomplete it for me with all of the superclass' arguments, 
    // and I'm not sure if those should go in there or not: 
    init(nm: String, ad: String) { 
     // And here I get errors: 
     super.init(nm: String, ad: String) 

    // etc.... 

Apple的iBook具有子類化的示例,但沒有那些具有帶有任何實際參數的init()方法的要素類。他們所有的init都沒有參數。

那麼,你如何做到這一點?

+0

我認爲你可以(也應該)通過聲明以大寫字母右邊的類讓你的代碼更加清晰? – Anima

回答

32

除了查克的回答,您還可以調用super.init

之前初始化你的新特性介紹

指定的初始值設定項必須確保其類所引入的所有屬性 在它委派給一個 超類初始化程序之前都會被初始化。 (雨燕編程語言 - >語言指南 - >初始化)

因此,爲了使其工作:

init(nm: String, ad: String) { 
    numberPriorVisits = 0 
    super.init(nm: nm, ad: ad) 
} 

這個簡單的初始化爲零可能已通過設置該屬性的默認值完成也爲零。它也鼓勵這樣做:

var numberPriorVisits: Int = 0 

如果你不希望這樣的默認值,這將是有意義的延長你的初始化器還爲新屬性的新值:

init(name: String, ads: String, numberPriorVisits: Int) { 
    self.numberPriorVisits = numberPriorVisits 
    super.init(nm: name, ad: ads) 
} 
+0

那麼,我確實希望*不*必須將0的默認值設置爲'numberPriorVisits' - 但是您是說它確實鼓勵了嗎?你能分享你所學到的知識嗎?另外,一般來說,我試圖理解什麼是Swift中'init's'的最佳實踐。給所有屬性設置一個默認值並讓init方法無參數是更好的辦法嗎?或者最好是**不**具有任何默認值,並通過將參數傳遞給'init'來完成這一切? – sirab333

+0

@sirab:鼓勵我的意思是,如果你想初始化它到某個值,那麼鼓勵使用屬性的默認值的方式,而不是在初始化器中將屬性設置爲該值。那麼,如果你的解決方案使用默認值,那麼就不需要初始化參數。 –

+0

@sirab:我知道閱讀語言指南會鼓勵他。正如我在答覆中提到的那樣。它說:「如果一個屬性總是採用相同的初始值,提供一個默認值,而不是在初始化程序中設置一個值,最終結果是一樣的,但是......」去和讀:-) –

0

你試過設置值numberPriorVisits和改變類型的呼叫超級

class user { 
    var name:String 
    var address:String 

    init(nm: String, ad: String) { 
     name = nm 
     address = ad 
    } 
} 


class registeredUser : user { 
    var numberPriorVisits: Int; 

    init(nm: String, ad: String) { 
     self.numberPriorVisits = 0; 
     super.init(nm: nm, ad: ad) 
    } 
} 
11

在SWIFT 2.0和更高版本它的工作原理是這樣的(所有情況下)

init(newString:String) { 
    super.init(string:newString) 
    // Designed initialiser 
} 
override init(someString: String) { 
    super.init(mainString: someString) 
    // Override initialiser when subclass some class 
} 
required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
    // Some boilerplate code to handle error (needed when override) 
} 
convenience init(newString:String, withParameters:Dictionary<String,String>) { 
    self.init(someString:newString) 
    //Convenience initialiser 
}