首页 > 代码库 > 小谈KVC中KeyPath的集合运算符

小谈KVC中KeyPath的集合运算符

由于知识点比较简单,这里不再陈述一大堆的原理,直入主题。

KVC中的集合运算符有以下三类:

        1、简单集合运算符:@avg、@sum、@max、@min、@count (只能用在集合对象中,对象属性必须为数字类型)

    2、对象操作符:

               @unionOfObjects:返回指定属性的值的数组,不去重

               @distinctUnionOfObjects:返回指定属性去重后的值的数组

 

    3、数组 / 集体操作符:跟对象操作符很相似,只不过是在NSArrayNSSet所组成的集合中工作的。

               @unionOfArrays:返回一个数组,值由各个子数组的元素组成,不去重

               @distinctUnionOfArrays:返回一个数组,值由各个子数组的元素组成,去重

               @distinctUnionOfSets:和@distinctUnionOfArrays差不多, 只是它期望的是一个包含着NSSet对象的NSSet,并且会返回一个NSSet对象。因为集合不能有重复的值,所以只有distinct操作。

 

上代码:

        场景:有一个Person类,有name和age两个属性。实例化5个对象,求其平均年龄、年龄总和、最大年龄和最小年龄。

Person类头文件:

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface Person : NSObject
 4 
 5 /**
 6  姓名
 7  */
 8 @property(nonatomic,copy) NSString *name;
 9 
10 /**
11  年龄
12  */
13 @property(nonatomic,assign) NSInteger age;
14 
15 /**
16  自定义构造函数
17 
18  @param name 姓名
19  @param age  年龄
20 
21  @return 返回Person的对象
22  */
23 - (instancetype)initWithName:(NSString *)name andAge:(NSInteger)age;
24 
25 @end

Person的.m文件:

 1 #import "Person.h"
 2 
 3 @implementation Person
 4 
 5 - (instancetype)initWithName:(NSString *)name andAge:(NSInteger)age{
 6     if(self = [super init]){
 7         _name = name;
 8         _age = age;
 9     }
10     return self;
11 }
12 
13 @end

 控制器调用Person对象实现功能:

 1 @interface ViewController ()
 2 
 3 @end
 4 
 5 @implementation ViewController
 6 
 7 - (void)viewDidLoad {
 8     [super viewDidLoad];
 9     
10     Person *p1 = [[Person alloc] initWithName:@"xiaoming" andAge:10];
11     Person *p2 = [[Person alloc] initWithName:@"xiaoming" andAge:15];
12     Person *p3 = [[Person alloc] initWithName:@"xiaohong" andAge:20];
13     Person *p4 = [[Person alloc] initWithName:@"xiaoli" andAge:30];
14     Person *p5 = [[Person alloc] initWithName:@"xiaoli" andAge:55];
15     
16     // 简单集合运算符不能用在单个对象中,所以这里会报错
17     // int res = [[p1 valueForKeyPath:@"@sum.age"] integerValue];
18     
19     NSArray *perArray = @[p1, p2, p3, p4, p5];
20     
21     // 简单集合运算符
22     NSInteger avg = [[perArray valueForKeyPath:@"@avg.age"] integerValue];
23     NSInteger sum = [[perArray valueForKeyPath:@"@sum.age"] integerValue];
24     NSInteger max = [[perArray valueForKeyPath:@"@max.age"] integerValue];
25     NSInteger min = [[perArray valueForKeyPath:@"@min.age"] integerValue];
26     
27     // count:取数组中元素的个数,下面 3 种写法等价
28     NSInteger count = [[perArray valueForKeyPath:@"@count.age"] integerValue];
29     NSInteger count1 = [[perArray valueForKeyPath:@"@count"] integerValue];
30     NSInteger count2 = perArray.count;
31     
32     
33     // 对象操作符:对数组对象进行操作
34     // @unionOfObjects:返回指定属性的值的数组,不去重
35     // @distinctUnionOfObjects:返回指定属性去重后的值的数组
36     NSArray<NSString *> *nameArray = [perArray valueForKeyPath:@"@unionOfObjects.name"];
37     NSArray<NSString *> *nameArray2 = [perArray valueForKeyPath:@"@distinctUnionOfObjects.name"];
38     
39     // 数组 / 集体操作符 : 对由NSArray和NSSet所组成的集合操作
40     // unionOfArrays:返回一个数组,值由各个子数组的元素组成,不去重
41     // distinctUnionOfArrays:返回一个数组,值由各个子数组的元素组成,去重
42     // distinctUnionOfSets:和distinctUnionOfArrays差不多, 只是它期望的是一个包含着NSSet对象的NSSet,并且会返回一个NSSet对象。因为集合不能包含重复的值,所以它只有distinct操作。
43     Person *P1 = [[Person alloc] initWithName:@"PP1" andAge:10];
44     Person *P2 = [[Person alloc] initWithName:@"PP1" andAge:20];
45     Person *P3 = [[Person alloc] initWithName:@"PP2" andAge:30];
46     Person *P4 = [[Person alloc] initWithName:@"PP3" andAge:40];
47     Person *P5 = [[Person alloc] initWithName:@"PP3" andAge:50];
48     NSArray *perArray2 = @[P1, P2, P3, P4, P5];
49     
50     NSArray *arr1 = [@[perArray,perArray2] valueForKeyPath:@"@unionOfArrays.name"];
51     NSArray *arr2 = [@[perArray,perArray2] valueForKeyPath:@"@distinctUnionOfArrays.name"];
52 }
53 
54 @end

 

小谈KVC中KeyPath的集合运算符