swift-29构造函数(KVC)

我以前做的swift笔记, 之前都是整理在onenote上, 最近想到整理出博客. 也方便自己查找, 可以当做自己的一份文档.

swift-29构造函数(KVC)_第1张图片
image.png
override func viewDidLoad() {
        super.viewDidLoad()

//        let p = Person(dict: ["name": "小花" as AnyObject, "age": 100 as AnyObject, "title": "标题" as AnyObject])
//        print("\(p.name) \(p.age) \(p.title)")
        let s = Student(dict: ["name": "小红" as AnyObject, "age": "18" as AnyObject, "title": "标题" as AnyObject, "no": "001" as AnyObject, "xxx": "haah" as AnyObject])
        print("\(s.name) \(s.age) \(s.title) \(s.no))")
        
    }
swift-29构造函数(KVC)_第2张图片
image.png
//
//  Person.swift
//  13构造函数(KVC)

import UIKit
/**
 1定义模型属性的时候 如果是对象 通常是可选的
    -在需要的时候创建
    -避免写构造函数 可以简化代码
 2如果是基本数据类型 不能设置成可选的 而且要设置初始值 否则 KVC会奔溃!
 3如果需要使用KVC设置数值 属性不能是 private , 在swift中, private外部是完全不让访问的
 4使用KVC方法之前 应该调用 super.init 保证对象实例化完成
 5重写 setValue(_ value: Any?, forUndefinedKey key: String) 方法, 防止字典的key 不存在,导致的奔溃
 例子:
 YYModel 是oc写的, 使用YYModel的注意点就为以上几点
 父类重载了构造函数 使用字典转模型
 子类添加属性, 不实现构造函数, 直接基础父类的构造函数, 实现字典转模型
 */
/**
 继承:
 子类继承父类的所有方法和属性, 可以直接使用父类的方法和属性
 */

class Person: NSObject {
    //name 属性是可选的 在oc中 很多属性都是需要的手创建的
    // 例如 vc.view / tableViewCell.textLabel
    // 因为在手机开发 内存很宝贵 有些属性并不是一定需要分配空间的
    // 延迟加载 在需要的时候再创建
    var name: String?
    
    //给基本数据类型初始化
    //使用KVC 会提示无法找到 age 的KEY
    // -原因: Int 是一个基本数据类型的结构体 oc中没有 oc中只有基本数据类型!
    //var age: Int? 会奔溃
    var age: Int = 0
    
    //private var title: String? 会奔溃
    //如果是private 修饰属性 使用KVC 设置值的时候 同样无法设置
    //如果设置成 private 属性/方法 禁止外部访问的
    // oc中 东西隐藏在.m 代码编写敲不出来, 但实际使用runtime 实际可以访问到
    // 但swift中 private 修饰, 就真的外部完全访问不到
    var title: String?
    
    //重载构造函数 使用字典为本类设置初始值
    init(dict: [String: AnyObject]) {
        super.init()
        setValuesForKeys(dict)
        
        // Use of 'self' in method call 'setValuesForKeys' before super.init initializes self
        // 使用 self的方法 'setValuesForKeys' **之前** 应该调用 super.init
        //kvc的方法 是oc的方法 **在运行时给对象发送消息**
        // **要求对象已经实例化完成
        
//        super.init()
    }
    
    //重写父类方法
    override func setValue(_ value: Any?, forUndefinedKey key: String) {
        //没有调用 super  将父类的代码完全覆盖 不会奔溃!
    }

}
swift-29构造函数(KVC)_第3张图片
image.png

你可能感兴趣的:(swift-29构造函数(KVC))