当KVC从一个类型中搜索属性时,会先按照一定模式来直接获取属性。比如属性值是myProp,KVC会搜索myProp或isMyProp这样命名的属性(可参考KVC文档中的Commonly Used Accessor Patterns)。
而当上述属性没有被找到后,KVC会继续搜索集合样式的执行方法(可参考KVC文档中的Collection Accessor Patterns for To-Many Properties),官方文档中讲了许多执行方式,NSArray和NSSet(官方文档中的Indexed Accessor Pattern代表NSArray,Unordered Accessor Pattern代表NSSet),以及非Mutable和Mutable的方式。这里就拿就简单NSArray做示例。
定义一个类型MyData,拟定我们需要的属性叫mgen。则需要定义countOfMgen方法和objectInMgenAtIndex:index:方法。
如下代码:
#import "MyData.h"
@implementation MyData
//数组长度
- (NSUInteger)countOfMgen;
{
return 4;
}
//数组成员
- (id)objectInMgenAtIndex:(NSUInteger)index;
{
return [NSNumber numberWithUnsignedInt:index + 1];
}
@end
OK,接下来就可以使用了:
MyData *mydata = [[MyData alloc] init];
//通过KVC获取属性值
NSArray *arr = [mydata valueForKeyPath:@"mgen"];
NSLog(@"%@", [arr class]);
NSLog(@"%@", arr);
输出:
NSKeyValueArray
(
1,
2,
3,
4
)
成功通过KVC获取数组,要知道我们的类型MyData中是没有直接定义任何命名是mgen的属性。
同时注意KVC返回的数组类型是NSKeyValueArray,该类型继承自NSArray,通过改写部分NSArray类型的方法从而实现KVC中的特殊调用。
我们还可以继续使用这个数组做KVC的集合操作,比如获取这个数组的平均值,代码如下:
MyData *mydata = [[MyData alloc] init];
//KVC集合caozuofu.html" target="_blank">操作符
NSNumber *number = [mydata valueForKeyPath:@"mgen.@avg.self"];
NSLog(@"%@", number);
输出:
2.5
当然KVC还包含非常多的内容,官方文档永远是最好的书。