小谈KVC中KeyPath的集合运算符
|
由于知识点比较简单,这里不再陈述一大堆的原理,直入主题。 KVC中的集合运算符有以下三类: 1、简单集合运算符:@avg、@sum、@max、@min、@count (只能用在集合对象中,对象属性必须为数字类型) 2、对象操作符: @unionOfObjects:返回指定属性的值的数组,不去重 @distinctUnionOfObjects:返回指定属性去重后的值的数组
3、数组 / 集体操作符:跟对象操作符很相似,只不过是在 @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
(编辑:佛山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


