構造函數---KVC構造函數swift
/**ide
構造函數 - 創建一個`對象`函數
1. 給屬性分配空間spa
2. 設置初始數值設計
Swift 中構造函數`都`是 init調試
重載:OC中沒有重載的概念code
函數名相同,參數的個數&類型不一樣,叫作重載,是面向對象設計語言必備標誌!orm
OC 中使用 initWithXXX的方式替代對象
*/開發
// Person.swift import UIKit class Person: NSObject { // 對象的屬性就是應該可變的 // 可選項,容許變量爲空,var 的默認值就是 nil // 在 iOS 開發中,全部的屬性是延遲加載的 var name: String? // age 和 KVC 不兼容,OC中Int屬於基本數據類型,不存在 `nil` 的概念 var age: Int = 0 /// KVC 的構造函數,用字典設置模型 init(dict: [String: AnyObject]) { // KVC 是 OC 特有的,本質是在運行時,動態的給`對象`發送 `setVaule:forKey:` 消息 // 設置數值 - 調用 super.init 保證對象已經被建立完成 super.init() // KVC 的設置數值 setValuesForKeysWithDictionary(dict) } }
// ViewController.swift
import UIKit // 提示:在 Swift 中,默認全部的屬性和方法,都是全局共享的,不須要 import,能夠直接使用 class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let p = Student(dict: ["name": "zhangsan", "age": 19]) print("\(p.name) --- \(p.age)") } }
KVC函數調用順序調試
// Person.swift import UIKit class Person: NSObject { // 對象的屬性就是應該可變的 // 可選項,容許變量爲空,var 的默認值就是 nil // 在 iOS 開發中,全部的屬性是延遲加載的 var name: String? // age 和 KVC 不兼容,OC中Int屬於基本數據類型,不存在 `nil` 的概念 var age: Int = 0 /// KVC 的構造函數,用字典設置模型 init(dict: [String: AnyObject]) { // KVC 是 OC 特有的,本質是在運行時,動態的給`對象`發送 `setVaule:forKey:` 消息 // 設置數值 - 調用 super.init 保證對象已經被建立完成 super.init() // KVC 的設置數值 setValuesForKeysWithDictionary(dict) } override func setValue(value: AnyObject?, forKey key: String) { print("forKey \(key) - \(value)") super.setValue(value, forKey: key) } /// 默認的 setValue forUndefinedKey 方法若是出現未定義的key會拋出 `NSUndefinedKeyException`異常,讓程序崩潰 /// 若是一旦重寫了此方法,同時不 super,不調用父類默認的方法! override func setValue(value: AnyObject?, forUndefinedKey key: String) { print("forUndefinedKey \(key) \(value)") } }
// ViewController.swift import UIKit // 提示:在 Swift 中,默認全部的屬性和方法,都是全局共享的,不須要 import,能夠直接使用 class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let p = Student(dict: ["name": "網舞", "age": 19, "title": "hahah", "no": "009"]) print("\(p.name) --- \(p.age)") } }