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

構(gòu)造函數(shù)是一種特殊的函數(shù),主要用來(lái)在創(chuàng)建對(duì)象時(shí)初始化對(duì)象,為對(duì)象成員變量設(shè)置初始值,在 OC 中的構(gòu)造函數(shù)是 initWithXXX,在 Swift 中由于支持函數(shù)重載,所有的構(gòu)造函數(shù)都是 init

構(gòu)造函數(shù)的作用

  • 分配空間 alloc
  • 設(shè)置初始值 init

必選屬性

  • 自定義 Person 對(duì)象
class Person: NSObject {

    /// 姓名
    var name: String
    /// 年齡
    var age: Int
}

提示錯(cuò)誤 Class 'Person' has no initializers -> 'Person' 類沒(méi)有實(shí)例化器s

原因:如果一個(gè)類中定義了必選屬性,必須通過(guò)構(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' 沒(méi)有在隱式生成的 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' 沒(méi)有在 super.init 調(diào)用前被初始化

  • 為比選屬性設(shè)置初始值
/// `重寫`父類的構(gòu)造函數(shù)
override init() {
    name = "張三"
    age = 18
    
    super.init()
}

小結(jié)

  • 非 Optional 屬性,都必須在構(gòu)造函數(shù)中設(shè)置初始值,從而保證對(duì)象在被實(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 屬性

  • 將對(duì)象屬性類型設(shè)置為 Optional
class Person: NSObject {
    /// 姓名
    var name: String?
    /// 年齡
    var age: Int?
}
  • 可選屬性不需要設(shè)置初始值,默認(rèn)初始值都是 nil
  • 可選屬性是在設(shè)置數(shù)值的時(shí)候才分配空間的,是延遲分配空間的,更加符合移動(dòng)開(kāi)發(fā)中延遲創(chuàng)建的原則
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容