ios 开发集合操作避免使用循环

键值编码(KVC)集合操作(Collection Operators)提供了一种非常简洁的运算方法,可以有效避免使用循环,如for,while或快速枚举。
这些方法包括三种类型,简单集合运算符、对象操作符、数组和集合操作符

集合操作文章地址
http://kickingbear.com/blog/archives/9

1.简单集合运算符,返回strings,number或dates

@count : 返回一个值为集合中对象总数的NSNumber对象。
@sum : 首先把集合中的每个对象都转换为double类型,然后计算其总,最后返回一个值为这个总和的NSNumber对象。
@avg: 计算平均值,最后返回一个值为这个总和的NSNumber对象。
@max : 使用compare:方法来确定最大值。所以为了让其正常工作,集合中所有的对象都必须支持和另一个对象的比较。
@min : 和@max一样,但是返回的是集合中的最小值。

@interface Product : NSObject
@property NSString *name;
@property double price;
@end



Product *model1 = [[Product alloc] init];
model1.name = @"iPhone 6";
model1.price = 6000;

Product *model2 = [[Product alloc] init];
model2.name = @"iPhone 7";
model2.price = 7000;

Product *model3 = [[Product alloc] init];
model3.name = @"iPhone 8";
model3.price = 8000;

Product *model4 = [[Product alloc] init];
model4.name = @"iPhone x";
model4.price = 10000;

NSArray *array = @[model1, model2, model3, model4]; 

使用集合操作得到数组个数、价格总和、均价、最大价格。

[products valueForKeyPath:@"@count"]; 
[products valueForKeyPath:@"@sum.price"]; 
[products valueForKeyPath:@"@avg.price"]; 
[products valueForKeyPath:@"@max.price"]; 

2.对象操作符,返回一个数组

@unionOfObjects/@distinctUnionOfObjects: 返回一个由操作符右边的key path所指定的对象属性组成的数组。其中@distinctUnionOfObjects 会对数组去重, 而且 @unionOfObjects 不会。
有以下数组,每个数组成员都是一个Product类对象。

Product *model1 = [[Product alloc] init];
model1.name = @"iPhone 6";
model1.price = 6000;

Product *model2 = [[Product alloc] init];
model2.name = @"iPhone 6";
model2.price = 6000;

Product *model3 = [[Product alloc] init];
model3.name = @"iPhone 8";
model3.price = 8000;

Product *model4 = [[Product alloc] init];
model4.name = @"iPhone x";
model4.price = 10000;

NSArray *array = @[model1, model2, model3, model4];


[array valueForKeyPath:@"@unionOfObjects.name"]; //"iPhone 6", "iPhone 6", "iPhone 8", "iPhone x"
[array valueForKeyPath:@"@distinctUnionOfObjects.name"]; // "iPhone 6", "iPhone 8", "iPhone x"

3.数组和集合运算符,返回一个数组或者集合

@distinctUnionOfArrays/@unionOfArrays: 返回了一个数组,其中包含这个集合中每个数组对于这个操作符右面指定的key path进行操作之后的值,distinct版本会移除重复的值。

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

推荐阅读更多精彩内容