構(gòu)造函數(shù)
是一種特殊的函數(shù)寇损,主要用來在創(chuàng)建對象時(shí)初始化對象凸郑,為對象成員變量
設(shè)置初始值,在 OC 中的構(gòu)造函數(shù)是 initWithXXX润绵,在 Swift 中由于支持函數(shù)重載线椰,所有的構(gòu)造函數(shù)都是init
構(gòu)造函數(shù)的作用
- 分配空間
alloc
- 設(shè)置初始值
init
必選屬性
- 自定義
Person
對象
class Person: NSObject {
/// 姓名
var name: String
/// 年齡
var age: Int
}
提示錯(cuò)誤 Class 'Person' has no initializers
-> 'Person' 類沒有實(shí)例化器s
原因:如果一個(gè)類中定義了必選屬性,必須通過構(gòu)造函數(shù)為這些必選屬性分配空間并且設(shè)置初始值
-
重寫
父類的構(gòu)造函數(shù)
/// `重寫`父類的構(gòu)造函數(shù)
override init() {
}
提示錯(cuò)誤 Property 'self.name' not initialized at implicitly generated super.init call
-> 屬性 'self.name' 沒有在隱式生成的 super.init 調(diào)用前被初始化
- 手動(dòng)添加
super.init()
調(diào)用
/// `重寫`父類的構(gòu)造函數(shù)
override init() {
super.init()
}
提示錯(cuò)誤 Property 'self.name' not initialized at super.init call
-> 屬性 'self.name' 沒有在 super.init 調(diào)用前被初始化
- 為比選屬性設(shè)置初始值
/// `重寫`父類的構(gòu)造函數(shù)
override init() {
name = "張三"
age = 18
super.init()
}
小結(jié)
- 非 Optional 屬性尘盼,都必須在構(gòu)造函數(shù)中設(shè)置初始值憨愉,從而保證對象在被實(shí)例化的時(shí)候,屬性都被正確初始化
- 在調(diào)用父類構(gòu)造函數(shù)之前卿捎,必須保證本類的屬性都已經(jīng)完成初始化
- Swift 中的構(gòu)造函數(shù)不用寫
func
子類的構(gòu)造函數(shù)
- 自定義子類時(shí)配紫,需要在構(gòu)造函數(shù)中,首先為本類定義的屬性設(shè)置初始值
- 然后再調(diào)用父類的構(gòu)造函數(shù)午阵,初始化父類中定義的屬性
/// 學(xué)生類
class Student: Person {
/// 學(xué)號(hào)
var no: String
override init() {
no = "001"
super.init()
}
}
小結(jié)
- 先調(diào)用本類的構(gòu)造函數(shù)初始化本類的屬性
- 然后調(diào)用父類的構(gòu)造函數(shù)初始化父類的屬性
- Xcode 7 beta 5之后躺孝,父類的構(gòu)造函數(shù)會(huì)被自動(dòng)調(diào)用享扔,強(qiáng)烈建議寫
super.init()
,保持代碼執(zhí)行線索的可讀性 -
super.init()
必須放在本類屬性初始化的后面植袍,保證本類屬性全部初始化完成
Optional
屬性
- 將對象屬性類型設(shè)置為
Optional
class Person: NSObject {
/// 姓名
var name: String?
/// 年齡
var age: Int?
}
-
可選屬性
不需要設(shè)置初始值惧眠,默認(rèn)初始值都是 nil -
可選屬性
是在設(shè)置數(shù)值的時(shí)候才分配空間的,是延遲分配空間的于个,更加符合移動(dòng)開發(fā)中延遲創(chuàng)建的原則