在介绍集合操作符强大的功能前我们先来看一下它的格式要求
1.png
简单的集合操作符
@avg 求均值
@interface People : NSObject
@property (nonatomic, copy) NSString *property;
- (instancetype)initWithProperty:(NSString *)property;
@end
- (void)viewDidLoad {
People *zhanSan = [[People alloc]initWithProperty:@"3.5"];
[array addObject:zhanSan];
People *liSi = [[People alloc]initWithProperty:@"4"];
[array addObject:liSi];
NSNumber *averageMoney = [array valueForKeyPath:@"@avg.property"];//结果是3.75
}
这里做个说明
Left key path 是可以省略的,一般情况下都省略
这个例子中的集合操作符是@avg
Right key path这里指定了是property财产这个属性,这一个是不可以省略的除了当使用@count时
可能有人会提出疑问,property不是NSString类型的吗,怎么会计算除了均值呢,这里它会默认转换成double类型,而返回值是NSNumber类型的。
留一个小练习:计算出一个数组中各元素的均值
@count
NSNumber *count = [array valueForKeyPath:@"@count"];//结果是2
除此外还有@sum,@max,@min
对象操作符
@distinctUnionOfObjects
NSArray *data = @[@"1", @"1", @"3"];
NSNumber *count = [data valueForKey:@"@count"];
NSArray *dataAfterOperation = [data valueForKeyPath:@"@distinctUnionOfObjects.self"];//结果是1,3
这个操作符会删除掉重复的元素,是不是很方便啊
@unionOfObjects
NSArray *data = @[@"1", @"3", @"1"];
NSNumber *count = [data valueForKey:@"@count"];
NSArray *dataAfterOperation = [data valueForKeyPath:@"@unionOfObjects.self"];//结果是1,3,1
这个操作不会去重,如数组中放了很多个People,而你只想获得这些人的名字的时候就可以用这个操作符了
数组和集合操作符
如果数组中嵌套了数组应该怎么办呢?
@distinctUnionOfArrays
NSMutableArray *array = [NSMutableArray new];
NSMutableArray *array1 = [NSMutableArray new];
People *zhanSan1 = [[People alloc]initWithProperty:@"3.5"];
People *liSi1 = [[People alloc]initWithProperty:@"4"];
[array1 addObject:zhanSan1];
[array1 addObject:liSi1];
NSMutableArray *array2 = [NSMutableArray new];
People *zhanSan2 = [[People alloc]initWithProperty:@"5"];
People *liSi2 = [[People alloc]initWithProperty:@"4"];
[array2 addObject:zhanSan2];
[array2 addObject:liSi2];
[array addObject:array1];
[array addObject:array2];
NSArray *results= [array valueForKeyPath:@"@distinctUnionOfArrays.property"];//结果是3.5,4,5
除此之外还有@unionOfArrays,@unionOfArrays,@distinctUnionOfSets
推荐阅读
KVC Collection Operators
网友评论