# 構(gòu)造函數(shù)基礎(chǔ)

構(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)建的原則
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容