KVC基础(Key-Value Coding Fundamentals)

来源:互联网 发布:windows pcl5和pcl6 编辑:程序博客网 时间:2024/05/12 11:14

KVC基础

本文描述KVC的基本原则。

Key和key路径

Key是用来标示对象特定属性的字符串。通常,一个key对应一个访问器方法或接收对象的实例变量。Key必须使用ASCII编码,以小写字母开头,不包含空格。

例如key可以为收款人,初始金额,交易和数量。

Key路径是是点分割key的字符串,用于指定对象属性遍历序列。第一个key的属性与接收者相关,每个后续关键key与前一个属性的值相关。

例如,key路径address.street可以从接收对象获取地址属性的值,并确定街道属性与地址对象相关。

使用KVC获取属性值

valueForKey:方法返回接收者相关指定key的值。如果没有指定key的访问器或实例变量,接收者发送自身valueForUndefinedKey:消息。valueForUndefinedKey:默认实现有一个 NSUndefinedKeyException子类可以重写该行为。

同样,valueForKeyPath:返回相关接收者指定key路径的值。Key路径序列中的任何对象中不兼容KVC属性key将接收到 valueForUndefinedKey:消息。

 dictionaryWithValuesForKeys: 方法搜索接收者相关key数组值。返回的NSDictionary包含数组中的所有key的值

注意:集合对象,例如NSArrayNSSetNSDictionary ,不能包含nil作为值。相反,你应该使用特定对象NSNull来代替nil。NSNull提供了实例代表对象属性值为nil。dictionaryWithValuesForKeys:setValuesForKeysWithDictionary:的默认实现自动转换NSNull和nil,所以你的对象不需要显式的测试NSNull值。

当key路径返回的值包含很多属性的key,并且该key不是路径中最后的key,返回值是一个集合,包含所有key对应的值。例如,请求key路径transactions.payee 返回一个数组包含所有交易的所有payee对象。这对key路径中多数组通用使用。Key路径accounts.transactions.payee返回所有账户所有交易的所有payee对象。

使用KVC设置属性值

setValue:forKey:方法设置接收者相关特定key的值。setValue:forKey:的默认实现自动将NSValue对象拆包为标量和结构来分配他们的属性。参见标量结构帮助( Scalar and Structure Support)了解更多关于装包和拆包语法。

如果指定的key不存在,接收者发送setValue:forUndefinedKey:一个消息。setValue:forUndefinedKey:的默认实现有NSUndefinedKeyException,然而子类可以重写此方法来自定义的方式处理请求。

setValue:forKeyPath: 方法类似的方式实现,但它能够处理key路径。

最后,setValuesForKeysWithDictionary:设置接收者的属性值为指定字典,使用字典的key来识别属性。setValue:forKey: 默认实现,对每个键值对,按要求使用NSNull代替nil。

你应该考虑一个额外的问题,当试图设置一个非空属性为nil值时会发生什么。在这种情况下,接收者会发送setNilValueForKey: 消息。setNilValueForKey: 默认实现有NSInvalidArgumentException。你的应用可以覆盖整个方法来替代默认值或标示值,然后调用setValue:forKey:设置新值。

点语法和KVC

Objective-C的点语法和KVC是相互独立的技术。你可以使用KVC不论你是否使用点语法,你可以使用点语法无论你是否使用KVC。同时,利用点语法。在KVC情况下,语法是用来划分key路径中的元素。记住,当你使用点语法访问一个属性时,你调用的的是接收者的标准访问器方法。

你可以使用KVC方法访问属性,例如如下定义的类:

@interface MyClass@property NSString *stringProperty;@property NSInteger integerProperty;@property MyClass *linkedInstance;@end


你可以使用KVC来访问实例属性

MyClass *myInstance = [[MyClass alloc] init];NSString *string = [myInstance valueForKey:@"stringProperty"];[myInstance setValue:@2 forKey:@"integerProperty"];


为了说明点语法与KVC key路径的差异,考虑一下情况。

MyClass *anotherInstance = [[MyClass alloc] init];myInstance.linkedInstance = anotherInstance;myInstance.linkedInstance.integerProperty = 2;

这有相同的结果:

MyClass *anotherInstance = [[MyClass alloc] init];myInstance.linkedInstance = anotherInstance;[myInstance setValue:@2 forKeyPath:@"linkedInstance.integerProperty"];

 

官方原文地址:

https://developer.apple.com/library/prerelease/tvos/documentation/Cocoa/Conceptual/KeyValueCoding/Articles/BasicPrinciples.html#//apple_ref/doc/uid/20002170-BAJEAIEE

0 0
原创粉丝点击