构造函数---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)") } }