由于知识点比较简单,这里不再陈述一大堆的原理,直入主题。
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 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 * nameArray = [perArray valueForKeyPath: @"@unionOfObjects.name"];
- 37 NSArray * 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
来源: http://www.cnblogs.com/panda1024/p/6014399.html