KVC构造函数注意点
来源:互联网 发布:研究生人际关系知乎 编辑:程序博客网 时间:2024/04/28 00:17
KVC构造函数
/// `重写`构造函数////// - parameter dict: 字典////// - returns: Person 对象init(dict: [String: AnyObject]) { setValuesForKeysWithDictionary(dict)}
- 以上代码编译就会报错!
原因:
- KVC 是 OC 特有的,KVC 本质上是在
运行时
,动态向对象发送setValue:ForKey:
方法,为对象的属性设置数值 - 因此,在使用 KVC 方法之前,需要确保对象已经被正确
实例化
- KVC 是 OC 特有的,KVC 本质上是在
添加
super.init()
同样会报错原因:
必选属性
必须在调用父类构造函数之前完成初始化分配工作
将必选参数修改为可选参数,调整后的代码如下:
/// 个人模型class Person: NSObject { /// 姓名 var name: String? /// 年龄 var age: Int? /// `重写`构造函数 /// /// - parameter dict: 字典 /// /// - returns: Person 对象 init(dict: [String: AnyObject]) { super.init() setValuesForKeysWithDictionary(dict) }}
运行测试,仍然会报错
错误信息:this class is not key value coding-compliant for the key age.
-> 这个类的键值 age 与 键值编码不兼容
- 原因:
- 基本数据类型在Swift ,与KVC不兼容
- 如果基本数据类型为nil,KVC在调用 setValue(value: AnyObject?, forKey key: String) 找不到这个属性
- 解决办法:给基本数据类型设置初始值
- 修改后的代码如下:
/// 姓名var name: String?/// 年龄var age: Int = 0/// `重写`构造函数////// - parameter dict: 字典////// - returns: Person 对象init(dict: [String: AnyObject]) { super.init() setValuesForKeysWithDictionary(dict)}
提示:在定义类时,基本数据类型属性一定要设置初始值,否则无法正常使用 KVC 设置数值
KVC 函数调用顺序
init(dict: [String: AnyObject]) { super.init() setValuesForKeysWithDictionary(dict)}override func setValue(value: AnyObject?, forKey key: String) { print("Key \(key) \(value)") super.setValue(value, forKey: key)}// `NSObject` 默认在发现没有定义的键值时,会抛出 `NSUndefinedKeyException` 异常override func setValue(value: AnyObject?, forUndefinedKey key: String) { print("UndefinedKey \(key) \(value)")}
setValuesForKeysWithDictionary
会按照字典中的key
重复调用setValue:forKey
函数- 如果没有实现
forUndefinedKey
函数,程序会直接崩溃- NSObject 默认在发现没有定义的键值时,会抛出
NSUndefinedKeyException
异常
- NSObject 默认在发现没有定义的键值时,会抛出
- 如果实现了
forUndefinedKey
,会保证setValuesForKeysWithDictionary
继续遍历后续的key
- 如果父类实现了
forUndefinedKey
,子类可以不必再实现此函数
子类的 KVC 函数
/// 学生类class Student: Person { /// 学号 var no: String?}
- 如果父类中已经实现了父类的相关方法,子类中不用再实现相关方法. 注意:如果子类不实现相关方法时,Xcode没有提示,需要硬写
0 0
- KVC构造函数注意点
- KVC构造函数
- 构造函数的几点注意
- C++ 赋值构造函数注意点
- C#构造函数的一些注意点
- IOS KVC 一些细节 注意点
- 使用KVC的一个注意点
- 构造器注意点
- Swift 4.构造函数-KVC构造
- C++类构造函数,拷贝构造函数,赋值函数,析构函数几点注意
- 类的静态构造函数的其他几个注意点
- 关于C++的构造函数的几点注意
- C#中静态构造函数的几点注意
- c++重载构造函数时应注意的几点
- 构造函数注意
- cvCloneImage函数注意点
- 3.15-函数注意点
- scanf函数注意点
- MyBatis批量插入
- MySQL使用入门
- 多条件搜索
- 把eclipse的android libary库项目融入gradle项目中苦与乐
- Gradle sync failed: Gradle DSL method not found: 'compile()',Consult IDE log for more details
- KVC构造函数注意点
- 费控表身份认证
- webView显示请求回来的H5代码出现乱码
- MyBatis查询一定时间数据
- html5--javascript的一系列操作(事件、正则表达式的验证)
- #ifdef 和 #if defined 的区别
- 漏斗将死,波纹方兴
- WM_TIMER
- 模糊查询城市