構(gòu)造函數(shù)
是一種特殊的函數(shù),主要用來在創(chuàng)建對象時初始化對象,為對象成員變量
設(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
}
提示錯誤 Class 'Person' has no initializers
-> 'Person' 類沒有實(shí)例化器s
原因:如果一個類中定義了必選屬性,必須通過構(gòu)造函數(shù)為這些必選屬性分配空間并且設(shè)置初始值
-
重寫
父類的構(gòu)造函數(shù)
/// `重寫`父類的構(gòu)造函數(shù)
override init() {
}
提示錯誤 Property 'self.name' not initialized at implicitly generated super.init call
-> 屬性 'self.name' 沒有在隱式生成的 super.init 調(diào)用前被初始化
- 手動添加
super.init()
調(diào)用
/// `重寫`父類的構(gòu)造函數(shù)
override init() {
super.init()
}
提示錯誤 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í)例化的時候,屬性都被正確初始化
- 在調(diào)用父類構(gòu)造函數(shù)之前,必須保證本類的屬性都已經(jīng)完成初始化
- Swift 中的構(gòu)造函數(shù)不用寫
func
子類的構(gòu)造函數(shù)
- 自定義子類時,需要在構(gòu)造函數(shù)中,首先為本類定義的屬性設(shè)置初始值
- 然后再調(diào)用父類的構(gòu)造函數(shù),初始化父類中定義的屬性
/// 學(xué)生類
class Student: Person {
/// 學(xué)號
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ù)會被自動調(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ù)值的時候才分配空間的,是延遲分配空間的,更加符合移動開發(fā)中延遲創(chuàng)建的原則