首页 > 代码库 > 小谈KVC中KeyPath的集合运算符
小谈KVC中KeyPath的集合运算符
由于知识点比较简单,这里不再陈述一大堆的原理,直入主题。
KVC中的集合运算符有以下三类:
1、简单集合运算符:@avg、@sum、@max、@min、@count (只能用在集合对象中,对象属性必须为数字类型)
2、对象操作符:
@unionOfObjects:返回指定属性的值的数组,不去重
@distinctUnionOfObjects:返回指定属性去重后的值的数组
3、数组 / 集体操作符:跟对象操作符很相似,只不过是在NSArray
和NSSet
所组成的集合中工作的。
@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的集合运算符
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。