Swift-構(gòu)造函數(shù),構(gòu)造函數(shù)與KVC

timg.jpg
淘劵吧

  • 構(gòu)造函數(shù)類似于OC中的初始化方法:init方法
  • 默認情況下載創(chuàng)建一個類時,必然會調(diào)用一個構(gòu)造函數(shù)
  • 即便是沒有編寫任何構(gòu)造函數(shù),編譯器也會提供一個默認的構(gòu)造函數(shù)。
  • 如果是繼承自NSObject,可以對父類的構(gòu)造函數(shù)進行重寫

創(chuàng)建Person類 繼承NSObject

  1. 聲明Name 屬性
class Person: NSObject {
    // 1,聲明name 屬性 會報錯:(Class 'Person' has no initializers (Person類沒有初始化器 默認是init))
    var name: String
}
  1. 調(diào)用默認初始化器
class Person: NSObject {
   // 1,聲明name 屬性 會報錯:(Class 'Person' has no initializers (Person類沒有初始化器 默認是init))
   var name: String
   
   // 2 ,調(diào)用默認的初始化器 會報錯:(Property 'self.name' not initialized at implicitly generated super.init call(在調(diào)用父類 構(gòu)造函數(shù)之前,self.name 沒有被初始化))
   override init() {
       print("-----------------Person init()-----------------")
       super.init()
   }
}
  1. 給name賦值
class Person: NSObject {
    // 1,聲明name 屬性 會報錯:(Class 'Person' has no initializers (Person類沒有初始化器 默認是init))
    var name: String
    
    // 2 ,調(diào)用默認的初始化器 會報錯:(Property 'self.name' not initialized at implicitly generated super.init call(在調(diào)用父類 構(gòu)造函數(shù)之前,self.name 沒有被初始化))
    override init() {
        //3,Property 'self.name' not initialized at super.init call (提示 self.name 初始化 分配空間,設置初始值)
        // 所以在 super.init() 之前 給name 賦值 
        name = "iOSCodeZhao"
        print("-----------------Person init()-----------------")
        super.init()
    }
}

實例化Person 調(diào)用構(gòu)造函數(shù)

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let person = Person();
        print(person.name)
    }
}

重寫,重載

重寫:父類有這個方法,子類重新實現(xiàn) 需要 override 關鍵字 如: override func viewDidLoad() {}

重載: 函數(shù)名相同 但是參數(shù)和個數(shù)不同,重載可以給自己的屬性從外部設置初始值, OC沒有重載,僅有initWith xxx 自定義初始化方法; 如果重載了構(gòu)造函數(shù),并不沒有實現(xiàn)父類 init 方法,系統(tǒng)不再提供init() 構(gòu)造函數(shù)默認是有的

class Person: NSObject {
    var name: String
    
    // 重寫
    override init() {
        print("Person init")
        name = "趙師順"
        super.init()
    }
    //重載
    init(name: String) {
        self.name = name;
        super.init()
    }
}

調(diào)用Person的重載

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // 調(diào)用系統(tǒng) 構(gòu)造函數(shù)
        let person = Person();
        print(person.name)
        // 重載
        let p = Person(name: "隔壁老王")
        print(p.name)
    }
}

控制臺輸出結(jié)果

屏幕快照 2017-09-08 下午4.10.54.png

構(gòu)造函數(shù)與KVC

注意事項:
1,定義模型屬性的時候,如果是對象,通常都是可選的
2, 如果是基本數(shù)據(jù)類型不能設置成可選的,而且要設置初始值
3,使用KVC 方法之前 應該調(diào)用 super.init()
4,如果使用KVC 設置數(shù)值,屬性不能是private 的

class Person: NSObject {
    // 在OC中很多屬性都是在需要的時候創(chuàng)建
    // 因為在手機開發(fā),內(nèi)存寶貴,有些屬性并不一定需要分配空間
    // 延遲加載,在需要的時候在創(chuàng)建
    var name: String?
    // 給基本數(shù)據(jù)類型做初始化
    var age = 0
    // 如果是Private 私有屬性,使用KVC設置值的時候,同樣無法設置
    // 如果設置成private  禁止外部訪問
    private var title: String?
    
    // 重載構(gòu)造函數(shù),使用字典為本類設置初始值
    init(dict: [String: AnyObject]) {
        super.init()
        // Use of 'self' in method call 'setValuesForKeys' before super.init initializes self(在使用setValuesForKeys之前 調(diào)用 super.init)
        //  KVC 方法是 OC方法,特點就是在運行時給對象發(fā)送消息
        // 所以要求 對象已經(jīng)實例化完成  而且name 是個可選值 所以        super.init() 放在前面
        setValuesForKeys(dict)
    }
}

調(diào)用

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let p  = Person(dict: ["name": "肇事順" as AnyObject])
        print(p.name ?? "")
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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