我有以下类,使用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()
方法的特征类,其中包含任何实际参数。他们所有的初学者都缺乏论据。
那么,你是怎么做到的?
答案 0 :(得分:34)
除了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)
}
答案 1 :(得分: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
}
答案 2 :(得分:3)
将参数传递给初始化器就像将参数传递给普通方法一样:
init(nm: String, ad: String) {
super.init(nm: nm, ad: ad)
}
作为参考,这显示在Swift语言指南的Designated and Convenience Initializers In Action部分。
答案 3 :(得分:0)
您是否尝试过将值设置为numberPriorVisits并更改调用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)
}
}