美文网首页
Swift KVC 的构造函数

Swift KVC 的构造函数

作者: 呦释原点 | 来源:发表于2017-03-12 15:37 被阅读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")
    
    

    相关文章

      网友评论

          本文标题:Swift KVC 的构造函数

          本文链接:https://www.haomeiwen.com/subject/rzntnttx.html