我将在Swift中重载init方法如何实现它?
这里我的代码不起作用
代码删除
编辑:
所以它会很好
override init() {
super.init();
}
init(title:String?) {
super.init();
self.title = title
}
convenience init(title:String?, imageName:String?) {
self.init(title:title)
self.imageName = imageName
}
convenience init(title:String?, imageName:String?, contentKey:String?) {
self.init(title:title, imageName:imageName)
self.contentKey = contentKey
}
更新的答案
class Y { }
class X : Y {
var title: String?
var imageName: String?
convenience override init() {
self.init(title: nil, imageName: nil)
}
convenience init(title:String?) {
self.init(title: title, imageName: nil)
}
init(title: String?, imageName: String?) {
self.title = title
self.imageName = imageName
super.init()
}
}
init(title: String?, imageName: String?)
是唯一设置其所有属性的初始化程序,因此它应该是指定的初始化程序。super.init()
之前初始化您的属性。
我的旧答案才有效,因为title
和imageName
都是var
和可选。
在The Swift Programming Language: Initialization的两阶段初始化部分
安全检查1
指定的初始值设定项必须确保在委托一个超类初始化程序之前初始化其类引入的所有属性。老答案
我将样品插入操场,以下是我如何使用它:
class Y { }
class X : Y {
var title: String?
var imageName: String?
override init() {
}
init(aTitle:String?) {
super.init()
self.title = aTitle
}
convenience init(aTitle:String?, aImageName:String?) {
self.init(aTitle: aTitle)
self.imageName = aImageName
}
}
init(aTitle:String?, aImageName:String?)
不能调用init(aTitle:)
并且仍然是指定的初始化程序,它必须是一个方便的初始化程序。self.init
必须在init(aTitle:String?, aImageName:String?)
之前。self.init(aTitle)
必须是self.init(aTitle: aTitle)
。作为旁注,我删除了不需要的分号,并将super.init()
放在第一位,因为样式原因。
希望有所帮助。
UPDATE
要遵循Apple的建议,应该只指定一个,其余应该是便利初始化器。例如,如果您确定init(aTitle:String?)
应该是指定的初始化程序,那么代码应如下所示:
convenience override init() {
self.init(aTitle: nil) // A convenience initializer calls the designated initializer.
}
init(aTitle:String?) {
super.init() // Only the designated initializer calls super.init.
self.title = aTitle
}
convenience init(aTitle:String?, aImageName:String?) {
self.init(aTitle: aTitle) // A convenience initializer calls the designated initializer.
self.imageName = aImageName
}
有时您可能需要多次指定的初始化程序,例如UIView
,但这应该是一个例外,而不是规则。
更新2
类应该有一个指定的初始化程序。便利初始化程序将(最终)调用指定的初始化程序。
一个类可能有多个初始值设定项。当初始化数据可以采用不同形式或某些初始化器时,为方便起见,提供默认值时会发生这种情况。在这种情况下,其中一个初始化方法称为指定初始化程序,它接受完整的初始化参数。
The Designated Initializer
获取完整初始化参数的类的初始化器通常是指定的初始化器。子类的指定初始化程序必须通过向super发送消息来调用其超类的指定初始值设定项。方便(或辅助)初始化程序 - 可以包括init-不要调用super。相反,他们使用下一个参数调用(通过消息自我)系列中的初始化程序,为未传递给它的参数提供默认值。本系列的最终初始化程序是指定的初始化程序。