- 定義模型屬性的時(shí)候,如果是對象,通常都是可選的
1.1 在需要的時(shí)候創(chuàng)建
1.2 避免寫構(gòu)造函數(shù), 可以簡化代碼 - 如果是基本數(shù)據(jù)類型,不能設(shè)置成可選的,而且要設(shè)置初始值,否則KVC會(huì)崩潰
- 如果是基本數(shù)據(jù)類型, 不能設(shè)置成可選的, 而且要設(shè)置初始值,否則KVC會(huì)崩潰
- 在使用KVC方法之前,應(yīng)該調(diào)用 super.init 保證對象示例化完成!
class Person: NSObject {
/*
可選屬性,延遲加載,在需要的時(shí)候再創(chuàng)建, 有些屬性不一定需要分配內(nèi)存空間, 例如: tableView.detailLabel
*/
var name: String?
/*
基本數(shù)據(jù)類型屬性初始化 使用KVC會(huì)提示無法找到age 的 KEY
swift中 Int是一個(gè)基本數(shù)據(jù)類型的結(jié)構(gòu)體, OC中沒有, OC中只有基本數(shù)據(jù)類型
*/
// var age: Int? // 運(yùn)行時(shí)崩潰了
var age: Int = 0
// 如果是 private 屬性, 使用KVC的時(shí)候,同樣無法賦值
// private var title: String?
var title: String?
// 重載構(gòu)造器,使用字典為本類設(shè)置初始值
init(dic: [String: AnyObject]) {
super.init()
setValuesForKeys(dic) //KVC 的方法 是OC 的方法, 在運(yùn)行時(shí)給對象發(fā)送消息
}
// 重寫父類的方法, 防止字典中設(shè)置屬性中沒有的元素
override func setValue(_ value: Any?, forUndefinedKey key: String) {
// 沒有調(diào)用 super, 將父類的代碼實(shí)現(xiàn)完全覆蓋! 初始化時(shí)字典中有屬性額外的元素不會(huì)崩潰
}
使用時(shí)
let p = Person(dic: ["name": "張三" as AnyObject, "age": 109 as AnyObject, "title": "BOSS" as AnyObject])
print("\(p.name)" + " \(p.age)" + " \(p.title)")
// Optional("張三") 109 Optional("BOSS")
在子類中, 如果子類沒有重寫父類的方法, 調(diào)用的時(shí)候,會(huì)直接調(diào)用父類的方法
class Student: Person {
var no: String?
}
使用時(shí)
let s = Student(dic: ["name": "老航" as AnyObject, "age": 189 as AnyObject, "title": "Boss" as AnyObject, "no": "0001" as AnyObject])
print("\(s.name) \(s.age) \(s.title) \(s.no)")
// Optional("老航") 189 Optional("Boss") Optional("0001")