天天看点

iOS - KVC 键值编码1、KVC2、数据模型3、KVC 赋值与取值4、KVC 异常处理5、KVC 消息传递6、KVC 字典转模型 数据冗余处理

KVC 是 Key-Value Coding 的简写,是键值编码的意思,属于 runtime 方法。Key Value Coding 是 cocoa 的一个标准组成部分,是间接给对象属性设置数值的方法,它能让我们可以通过 name(key) 的方式访问属性变量, 不必调用明确的属性访问方法, 如我们有个属性变量叫做 foo, 我们可以 foo 直接访问它,同样我们也可以用 KVC 来完成 [Object valueForKey:@“foo”], 这样做主要的好处就是来减少我们的代码量。

程序执行过程中,KVC 动态给对象属性设置数值,不关心属性在 .h 和 .m 中是如何定义的,只要对象有属性,就能够读取和设置。这种方式,有点违背程序的开发原则。

在 iOS 中,用 KVC 用的最多是核心动画,核心动画是通过 KVC 对涂层的可动画属性设置数值来实现的。

模型是专门用来存放数据的对象,一般都是一些直接继承自 NSObject 的纯对象,内部会提供一些属性来存放数据,控制器可以直接传递模型给视图控件以显示空间的内容。

1)用模型取代字典的好处

使用字典的坏处:

一般情况下,设置数据和取出数据都使用 “字符串类型的 key”,编写这些 key 时,编辑器没有智能提示,需要手敲,手敲字符串 key,key 容易写错,Key 如果写错了,编译器不会有任何警告和报错,造成设错数据或者取错数据。如:

使用模型的好处:

所谓模型,其实就是数据模型,专门用来存放数据的对象,用它来表示数据会更加专业。模型设置数据和取出数据都是通过它的属性,属性名如果写错了,编译器会马上报错,因此,保证了数据的正确性

使用模型访问属性时,编译器会提供一系列的提示,提高编码效率。

2)字典转模型

字典转模型的过程最好封装在模型内部。

模型应该提供一个可以传入字典参数的构造方法。

3)字典转模型 KVC 方法

字典转模型:setValuesForKeysWithDictionary

字典中的 key 值需与要赋值的对象的属性变量名相同,并且都为字符串类型。

模型转字典:dictionaryWithValuesForKeys

参数是要被转换到字典中的属性名称

4)KVC 数据模型的设置

为了避免服务端返回的数值型数据是 null,可以把数值型的数据设置成 NSNumber 类型,否则会报错 could not set nil as the value for the key messageId 。

id 是服务端最喜欢用的属性,id 在 iOS 中是关键字,但在模型中可以正常使用的。

copy 属性,在设置数值的时候,如果有一方是可变的,会默认做一次 copy 操作,会建立新的副本,在模型中对象全都是用 copy 属性会比较安全。

定义为 copy 的属性,重写了 setter 方法之后,定义属性的 copy 就是摆设了,不会默认进行 copy 操作,必须要自己 copy 一下,否则设置数值的时候,不会 copy。

5)字典转模型的过程

iOS - KVC 键值编码1、KVC2、数据模型3、KVC 赋值与取值4、KVC 异常处理5、KVC 消息传递6、KVC 字典转模型 数据冗余处理

KVC 是一种操作全局变量的方法,无论是公有的,私有的,还是受保护的全都可以操作。

1、找对象的 setter 方法,找到就执行;

2、找不到 setter 方法就找 _name 变量,找到就赋值;

3、如果找不到 _name 变量,就找 name;

4、如果 name 也找不到就会让对象调用 -(void)setValue:forUnderfinedKey; 方法处理异常。

Objective-C

KvcClass.h

SubKvcClass.h

ViewController.m

Swift

KvcClass.swift

SubKvcClass.swift

ViewController.swift

必须得有标准的 getter 和 setter 方法,或者用 @property 声明。

调用 setValue: forKey: 方法以字符串的方式向对象发送消息,设置实例变量的值。第一个参数是要设置的值,第二个参数是实例变量的名称。

调用 valueForKey: 来获取实例变量的值。

如果实例变量中有其他类的对象,那么可以使用 setValue: forKeyPath: 给其他类的对象的属性变量赋值。

字典中的 key 值需与要赋值的对象的属性变量名相同。并且都为字符串类型。

在键值编码的类中使用以下两个方法处理 key 值不存在的异常。如果不做处理,编译时系统会报错。

KvcClass.m

在需要处理的数据源中有系统关键字时,在键值编码处理的类中使用以下两个方法处理 key 值为系统关键字的情况。

valueForKey: 的使用并不仅仅用来取值那么简单,还有很多特殊的用法,集合类也覆盖了这个方法,通过调用 valueForKey: 给容器中每一个对象发送操作消息,并且结果会被保存在一个新的容器中返回,这样我们能很方便地利用一个容器对象创建另一个容器对象。另外,valueForKeyPath: 还能实现多个消息的传递。

字典中元素与模型中的属性数量不想等的情况处理。处理 key 值不存在的异常。如果不做处理,编译时系统会报错。

继续阅读