1、KVC概述
KVC(Key-value coding)是一套利用字符串标识符间接访问对象属性和关系的机制。Cocoa Programming中,Core Data,Application Scriptability, 绑定(Binding)技术和声明属性之一语言特性等,都是以KVC为基础的。(Application Scriptability 和 绑定(Binding)是Mac OS X上特有的)。你也可以用Key-value coding来简化你的代码。
KVC(键-值编码)是一个用于间接访问对象属性的机制,使用该机制不需要调用get和set方法就可以设置或获取成员变量的值。
2、KVC的基础
Keys and Key Paths
KEY:键(Key)是一个标识了对象的某个属性的字符串。通常,在接收对象中,一个键对应的是一个访问方法或者实例变量的名称。Key必须是ASCII编码,以小写字母开头,并且不能包含空白符。
键的一些示例:payee, openingBalance, transactions, amount等
Key Path:键路径(Key Path)是一个由多个Key组成,Key与Key之间用点(.)分开的字符串,通过顺序遍历,获取对象属性。键路径中的键序列的第一个键相对于当前的接收对象,而后续的键只与前一个键对应的属性相关。
例如,对于键路径address.street,其中我们从当前的接收对象中获取address这一属性值,然后再通过这个address的对象属性去获取street属性。
使用KVC获取属性值:
方法valueForKey:
返回特定键对应的值,这个值是与接收对象相关的。如果输入的键没有对应的方法或者实例变量,接收对象会发出valueForUndefinedKey: 消息。方法valueForUndefinedKey:默认会抛出NSUndefinedKeyException异常,可以在子类中改写。
方法valueForKeyPath:
与之类似,返回特定键路径在对应接收对象中的值。当键路径的键序列中有任何一个键无法对应兼容KVC的对象,则接收对象都会发出valueForUndefinedKey: 消息。
方法dictionaryWithValuesForKeys:
对输入的键数组中的每一个键进行检索,返回包含了这些键对应的值的NSDictionary。
【备注】集合对象(Collection Object),如NSArray, NSSet, NSDictionary等不能包含nil值。可以使用NSNull来替代nil放入集合对象中标识空值。NSNull提供一个简单的实例来表示对象属性的nil值。在方法 dictionaryWithValuesForKeys: 和 setValuesForKeysWithDictionary: 中,NSNull和nil之间的转换是自动的,所以你的对象不用明确测试NSNull值。
使用KVC设置属性值:
方法setValue:forKey:
给特定的键设值,这个值相对于对应的接收对象或者是已经提供的值。
方法setValuesForKeysWithDictionary:
可以从字典映射到对象,不需要再给一一给对象来赋值。使用NSDictionary来给一组键设值。该方法内部调用setValue:forKey:给每一组键值对设值。想存入空值时,使用NSNull取代nil。 该方法常用于字典转模型中,比如:
- (instancetype)initWithDict:(NSDictionary *)dict
{
if (self = [super init]) {
self.icon = dict[@"icon"];
self.title = dict[@"title"];
self.answer = dict[@"answer"];
self.options = dict[@"options"];
}
return self;
}
+ (instancetype)questionWithDict:(NSDictionary *)dict
{
return [[self alloc] initWithDict:dict];
}
可以用KVC写成:
+ (instancetype) questionWithDict:(NSDictionary *)dict
{
return [[self alloc] initWithDict:dict];
}
- (instancetype)initWithDict:(NSDictionary *)dict
{
if (self = [super init]) {
[self setValuesForKeysWithDictionary:dict];
}
return self;
}