Swift KVC 的构造函数
2017-03-12 本文已影响137人
呦释原点
- 定义模型属性的时候,如果是对象,通常都是可选的
1.1 在需要的时候创建
1.2 避免写构造函数, 可以简化代码 - 如果是基本数据类型,不能设置成可选的,而且要设置初始值,否则KVC会崩溃
- 如果是基本数据类型, 不能设置成可选的, 而且要设置初始值,否则KVC会崩溃
- 在使用KVC方法之前,应该调用 super.init 保证对象示例化完成!
class Person: NSObject {
/*
可选属性,延迟加载,在需要的时候再创建, 有些属性不一定需要分配内存空间, 例如: tableView.detailLabel
*/
var name: String?
/*
基本数据类型属性初始化 使用KVC会提示无法找到age 的 KEY
swift中 Int是一个基本数据类型的结构体, OC中没有, OC中只有基本数据类型
*/
// var age: Int? // 运行时崩溃了
var age: Int = 0
// 如果是 private 属性, 使用KVC的时候,同样无法赋值
// private var title: String?
var title: String?
// 重载构造器,使用字典为本类设置初始值
init(dic: [String: AnyObject]) {
super.init()
setValuesForKeys(dic) //KVC 的方法 是OC 的方法, 在运行时给对象发送消息
}
// 重写父类的方法, 防止字典中设置属性中没有的元素
override func setValue(_ value: Any?, forUndefinedKey key: String) {
// 没有调用 super, 将父类的代码实现完全覆盖! 初始化时字典中有属性额外的元素不会崩溃
}
使用时
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")
在子类中, 如果子类没有重写父类的方法, 调用的时候,会直接调用父类的方法
class Student: Person {
var no: String?
}
使用时
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")