最近一些新人买了几本关于IOS开发的书,但是关于KVC的比较少。一些KVC使用的关注点也让人云里雾里。苹果官方文档也是简单叙述了使用。但是一些细节没写清楚。

代码如下:

建一个NSObject的类命名A

@interface A : NSObject

{

NSString *_name;

int _count;

NSArray *_arrA;

B *_b;

NSMutableArray *_all;

NSArray *_allA;

}

建个B类

@interface B : NSObject

{

NSString *_name;

int _count;

NSArray *_arrB;

}

然后在调用如下:

/*内置函数列表

@avg返回数组或者集合中所有元素的平均值

@count返回组数或者集合中元素的个数

@max返回组数或者集合中所有元素的最大值

@min返回组数或者集合中所有元素的最小值

@sum返回组数或者集合中所有元素的总和

@unoinOfArrays/@distinctUnionOfArrays给定一系列数组,返回一个包含所有数组的数组。对于distinct版本,返回数组中的元素不重复

@unionOfSets/@distinctUnionOfSets给定一系列集合,返回一个包含所有集合的集合。对于distinct版本,返回集合中的元素不重复。

@unionOfObjects/@distinctUnionOfObjects给定一系列集合或者数组,返回一个包含所有元素的数组。对于distinct版本,返回数组中元素不重复。*/

A *a=[[A alloc] init];

B *b=[[B alloc] init];

//[b setValue:@"zf" forKeyPath:@"_name"];

[a setValue:b forKey:@"_b"];

[a setValue:@"赵锋" forKey:@"_name"];

[a setValue:@(12) forKey:@"_count"];

[a setValue:@[@1,@2,@3,@4] forKey:@"_arrA"];

NSLog(@"%@ %@ %@",[a valueForKey:@"_name"],[a valueForKey:@"_count"],[a valueForKey:@"_arrA"]);

[a setValue:@"赵锋2" forKeyPath:@"_b._name"];//a里面b赋值了要使用路径 必须保证 a里面的b不为null。(本人在上面赋值了)

//当b不为null就可以进行一下路径使用了

[a setValue:@(13) forKeyPath:@"_b._count"];

[a setValue:@[@"e",@"f",@"g"] forKeyPath:@"_b._arrB"];

NSLog(@"%@ %@ %@",[a valueForKeyPath:@"_b._name"],[a valueForKeyPath:@"_b._count"],[a valueForKeyPath:@"_b._arrB"]);

NSMutableArray *temp=[[NSMutableArray alloc] init];

for (int i=0; i<5; i++) {

A *a2=[[A alloc] init];

[a2 setValue:@(i+20) forKey:@"_count"];

[temp addObject:a2];

}

for (int i=0; i<5; i++) {

A *a2=[[A alloc] init];

[a2 setValue:@(i+20) forKey:@"_count"];

[temp addObject:a2];

}

[a setValue:temp forKey:@"_all"];

NSMutableArray *t=[a valueForKey:@"_all"];

NSLog(@"%@" ,[t valueForKeyPath:@"@avg._count"]);

NSLog(@"%@" ,[a valueForKeyPath:@"_all.@avg._count"]);//必须数组

//使用@指令函数@avg@count@max@min@sum 要保证左边指令最后一层是数组

A *a2=[[A alloc] init];

[a2 setValue:@12 forKey:@"_count"];

A *a3=[[A alloc] init];

[a3 setValue:@13 forKey:@"_count"];

A *a4=[[A alloc] init];

[a4 setValue:@13 forKey:@"_count"];

A *a5=[[A alloc] init];

[a5 setValue:@15 forKey:@"_count"];

NSArray *tt=[[NSArray alloc] initWithObjects:a2,a3,a4,a5,nil];

a._allA=tt;

NSLog(@"%@",[tt valueForKey:@"_count"]);

NSLog(@"%@",[@[tt,t] valueForKeyPath:@"@unionOfArrays._count"]);//NSArray? 合并数组

NSLog(@"%@",[@[tt,t] valueForKeyPath:@"@distinctUnionOfArrays._count"]);//对多个数组进行合并去重

//注意使用的@[tt,t] 对多个数组有效 单个数组报错 如下会报错

NSArray* pencils = @[@{@"color": @"blue"},

@{@"color": @"red"},

@{@"color": @"blue"},

@{@"color": @"green"}];

//NSLog(@"color:%@",[pencils valueForKeyPath:@"@distinctUnionOfArrays.color"]);//错误

//单个数组错误

NSLog(@"%@",[a valueForKeyPath:@"_all.@unionOfObjects._count"]);

NSLog(@"%@",[a valueForKeyPath:@"_all.@distinctUnionOfObjects._count"]);

//对单个数组去重有效 多个无效 但不报错 多个数组原来什么样使用后还是什么样

具体Demo http://down.51cto.com/data/733639