convenience關(guān)鍵字
使用convenience
關(guān)鍵字增加init
方法
注意事項(xiàng):
- 增加
init
的初始化方法 - 必須調(diào)用
Swift
同一個(gè)類中的designated
初始化完成設(shè)置 -
convenience
的初始化方法不能被子類重寫(xiě)或者是從子類中以super
的方式被調(diào)用
通過(guò)convenience
對(duì)現(xiàn)有的類增加init
方法撒桨,例子如下
class People {
var name: String
init(name: String) {
self.name = name
}
}
extension People {
convenience init(smallName: String) {
self.init(name: smallName)
}
}
通過(guò)extension
給原有的People
類增加init
方法
// 使用convenience增加init方法
extension People {
convenience init(smallName: String) {
self.init(name: smallName)
}
}
結(jié)下來(lái)搬俊,Student
類繼承父類People
class Student: People {
var grade: Int
init(name: String, grade: Int) {
self.grade = grade
super.init(name: name)
// 無(wú)法調(diào)用
// super.init(smallName: name)
}
// 可以被重寫(xiě)
override init(name: String) {
grade = 1
super.init(name: name)
}
// 無(wú)法重寫(xiě),編譯不通過(guò)
override init(smallName: String) {
grade = 1
super.init(smallName: smallName)
}
}
-
子類對(duì)象調(diào)用父類的
convenience
的init
方法:只要在子類中實(shí)現(xiàn)重寫(xiě)了父類convenience
方法所需要的init
方法的話,我們?cè)谧宇愔芯涂梢允褂酶割惖?code>convenience初始化方法了
示例如下:
class People {
var name: String
init(name: String) {
self.name = name
}
}
// 使用convenience增加init方法
extension People {
convenience init(smallName: String) {
self.init(name: smallName)
}
}
// 子類
class Teacher: People {
var course: String
init(name: String, course: String) {
self.course = course
super.init(name: name)
}
override init(name: String) {
self.course = "math"
super.init(name: name)
}
}
// 調(diào)用convenience的init方法
let xiaoming = Teacher(smallName: "xiaoming")
- 總結(jié):子類的designated初始化方法必須調(diào)用父類的designated方法蕴轨,以保證父類也完成初始化昏滴。
required關(guān)鍵字
對(duì)于某些我們希望子類中一定實(shí)現(xiàn)的designated初始化方法抛虫,我們可以通過(guò)添加required關(guān)鍵字進(jìn)行限制懂缕,強(qiáng)制子類對(duì)這個(gè)方法重寫(xiě)。
class People {
var name: String
required init(name: String) {
self.name = name
}
}
// 使用convenience增加init方法
extension People {
convenience init(smallName: String) {
self.init(name: smallName)
}
}
// 子類
class Teacher: People {
var course: String
init(name: String, course: String) {
self.course = course
super.init(name: name)
}
required init(name: String) {
self.course = "math"
super.init(name: name)
}
}