1.指定構造和便利構造方法解析安全
這些是類類型的概念,在值類型裏沒有ide
class Ab {ui
var a: Intspa
var b: Int代理
//以init開頭就是指定構造orm
init(a: Int,b: Int){繼承
self.a = a編譯器
self.b = b//注意:類的指定構造方法裏不能像值類型那樣調用其餘構造器it
print("Class ab init")編譯
}
//相似值類型的構造方法,加上關鍵字convenience,搭配self.init就是便利構造方法,他經過調用其餘的構造方法來實現初始化,固然既能夠經過指定構造方法也能夠是其餘便利構造方法
convenience init(a: Int){
// self.a = a
// b = 0
self.init(a: a,b: 0)
}
}
2.派生類的構造方法
class Ab {
var a: Int
var b: Int
//以init開頭就是指定構造
init(a: Int,b: Int){
self.a = a
self.b = b//注意:類的指定構造方法裏不能像值類型那樣調用其餘構造器
print("Class ab init")
}
//相似值類型的構造方法,加上關鍵字convenience,搭配self.init就是便利構造方法,他經過調用其餘的構造方法來實現初始化,固然既能夠經過指定構造方法也能夠是其餘便利構造方法
convenience init(a: Int){
// self.a = a
// b = 0
self.init(a: a,b: 0)
}
}
class CD: Ab {
var c: Int
var d: Int
//構造方法默認是不會被繼承,基類的存儲屬性只能經過基類的構造方法來初始化。
//派生類引入的存儲屬性要先被初始化,而後在調用父類的構造方法對父類的屬性進行初始化
//咱們只能經過調用父類的指定構造方法來對父類的屬性進行初始化
init(c: Int,d: Int){//指定構造器
self.c = c
self.d = d
super.init(a: 1, b: 1)//經過父類指定構造方法來初始化
}
}
3.構造器鏈
//指定構造器必須調用其直接父類的指定構造器
//便利構造器必須調用同類中定義的其餘構造器(指定,便利)
//便利構造器必須最終以調用一個指定構造器結束。
4.兩段式構造--構造過程能夠劃分爲兩個階段:
第一,確保全部的存儲屬性都初始化完畢
第二,對父類中的存儲屬性作進一步的處理,能夠防止屬性在被初始化以前訪問,也能夠防止屬性被另一個構造器意外的賦值
class A {
var a: Int
init(a: Int){
self.a = a
}
}
class B: A{
var b: Int
init (a: Int,b: Int){
//派生類引入的屬性進行初始化
print(";b類第一階段初始化開始")
self.b = b//先初始化當前類的屬性
//再用父類的指定構造方法對父類的屬性進行初始化
super.init(a: a)
//額外的代碼執行
print("b類第二階段初始化開始")
if(b>100){
self.a = 100
}
}
}
5.派生類構造方法定義時的編譯器安全性檢查
首先應該將派生類引入的存儲屬性初始化,再向上代理父類的指定構造方法
首先調用父類的指定構造器實現父類中屬性的初始化以後,才能夠訪問父類的屬性
在便利構造器,首先調用同類中的其餘構造方法,才能夠訪問屬性
在第一階段完成以前,不能調用任何實例方法,不能訪問任何父類中的存儲屬性,不能引用self
6.重寫指定構造方法
是指子類構造方法與父類構造方法的參數列表同樣
class Human {
let name: String
var age: Int
init (name: String,age: Int){
self.name = name
self.age = age
}
}
class Woman: Human {
let haveBaby: Bool
//派生類定義一個指定構造方法去覆蓋父類中與他有相同參數列表的指定構造方法
// override init(name: String, age: Int) {
// haveBaby = false
// super.init(name: name, age: age)
// }
//也能夠定義指定構造方法,引出便利構造方法,用便利構造器覆蓋
init(name: String, age: Int,haveBaby: Bool) {
self.haveBaby = haveBaby
super.init(name: name, age: age)
}
override convenience init(name: String, age: Int) {
self.init(name: name,age: age,haveBaby: false)
}
}
7.構造方法的自動繼承
a.若是子類中沒有定義任何的構造方法,且子類中全部的存儲屬性都有默認缺省值,會自動繼承父類中全部的構造方法,包括便利構造方法.可是子類中有本身定義的構造方法則不會繼承父類的任何構造方法
b。若是子類中只是重寫了父類中的某些(而不是所有)指定構造方法,無論子類中的存儲屬性是否有缺省值,都不會繼承父類中的其餘構造方法
c。若是子類中重寫了父類中全部的指定構造方法,無論子類中的存儲屬性是否有缺省值,都同時會繼承父類中全部的便利構造方法
class xy {
var x: Int
var y: Int
init(x: Int,y: Int){
self.x = x
self.y = y
}
convenience init(){
self.init(x:0,y:0)
}
}
class xyz: xy {
var z: Int = 10
// init(z: Int){
// self.z = z
// super.init(x: 0, y: 0)
// }//一旦定義本身的構造方法,則不能繼承父類的構造方法
}
var r1 = xyz()
var r2 = xyz(x: 2, y: 2)//當xyz類中沒有任何構造方法時,且本身的存儲屬性有缺省值時,就能繼承父類的構造方法
8.必須構造器
構造方法所屬的類的後續子子孫孫類必須實現這個構造方法
class Some {
var some: Int
required init(){
some = 0
}
}
class Subsome: Some {
var sub: Int
init(sub: Int){
self.sub = sub
super.init()
}
required init() {//required必須得寫
sub = 0
super.init()
}
}
class Subsubsome: Subsome {
required init() {
super.init()
}
}