Swift的子类化 – 如何重写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.... 

苹果公司的iBook有子类化的例子,但没有那些具有init()方法的特征类,其中有任何实际的参数。 他们所有的init都没有参数。

那么,你如何做到这一点?

除了Chuck的回答外,你还必须在调用super.init之前初始化新的属性

指定的初始化程序必须确保在其委托给超类初始化程序之前,其类所引入的所有属性都被初始化。 (Swift编程语言 – >语言指南 – >初始化)

因此,要使其工作:

 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) } 

在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 } 

你传递参数给一个初始化器,就像你传递参数到一个普通的方法一样:

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

有关参考资料,请参阅Swift语言指南的指定和便捷初始化程序中的操作部分。

您是否尝试过将值设置为numberPriorVisits,并将调用的types更改为super

 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) } }