构造函数---KVC构造函数
/**
构造函数 - 建立一个`对象`
1. 给属性分配空间
2. 设置初始数值
Swift 中构造函数`都`是 init
重载:OC中没有重载的概念
函数名相同,参数的个数&类型不同,叫做重载,是面向对象设计语言必备标志!
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)")
}
}