Swift KVC 的构造函数

2017-03-12  本文已影响137人  呦释原点
  1. 定义模型属性的时候,如果是对象,通常都是可选的
    1.1 在需要的时候创建
    1.2 避免写构造函数, 可以简化代码
  2. 如果是基本数据类型,不能设置成可选的,而且要设置初始值,否则KVC会崩溃
  3. 如果是基本数据类型, 不能设置成可选的, 而且要设置初始值,否则KVC会崩溃
  4. 在使用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")

上一篇 下一篇

猜你喜欢

热点阅读