键值编码(KVC)集合操做(Collection Operators)提供了一种很是简洁的运算方法,能够有效避免使用循环,如for,while或快速枚举。 数组
这些方法包括三种类型,简单集合运算符、对象操做符、数组和集合操做符。Apple不容许自定义集合操做符,但实际上利用swizzle黑魔法,能够作到自定义操做符。有兴趣能够参考http://kickingbear.com/blog/archives/9 编码
@count : 返回一个值为集合中对象总数的NSNumber对象。
@sum : 首先把集合中的每一个对象都转换为double类型,而后计算其总,最后返回一个值为这个总和的NSNumber对象。
@avg: Takes the double value of each object in the collection, and returns the average value as an NSNumber.
@max : 使用compare:方法来肯定最大值。因此为了让其正常工做,集合中全部的对象都必须支持和另外一个对象的比较。
@min : 和@max同样,可是返回的是集合中的最小值。 spa
假设一个Product类,以下所示 .net
@interface Product : NSObject @property NSString *name; @property double price; @property NSDate *launchedOn; @end
数据以下图所示,组成一个products数组,这里省略了初始化一个Product对象,并添加至products数组的代码,请自行脑补。 code
那么使用kvc键值路径的运算符操做,能够获得数组个数、价格总和、均价和最先发布日期 对象
[products valueForKeyPath:@"@count"]; // 4 [products valueForKeyPath:@"@sum.price"]; // 3526.00 [products valueForKeyPath:@"@avg.price"]; // 881.50 [products valueForKeyPath:@"@max.price"]; // 1699.00 [products valueForKeyPath:@"@min.launchedOn"]; // June 11, 2012
2. 对象操做符,返回一个数组 blog
@unionOfObjects/@distinctUnionOfObjects: 返回一个由操做符右边的key path所指定的对象属性组成的数组。其中@distinctUnionOfObjects 会对数组去重, 并且 @unionOfObjects 不会。 get
有如下数组,每一个数组成员都是一个Product类对象。 string
NSArray *inventory = @[iPhone5, iPhone5, iPhone5, iPadMini, macBookPro, macBookPro];那么,
[inventory valueForKeyPath:@"@unionOfObjects.name"]; // "iPhone 5", "iPhone 5", "iPhone 5", "iPad Mini", "MacBook Pro", "MacBook Pro" [inventory valueForKeyPath:@"@distinctUnionOfObjects.name"]; // "iPhone 5", "iPad Mini", "MacBook Pro"
3. 数组和集合运算符,返回一个数组或者集合 io
@distinctUnionOfArrays/@unionOfArrays: 返回了一个数组,其中包含这个集合中每一个数组对于这个操做符右面指定的key path进行操做以后的值。正如你指望的,distinct版本会移除重复的值。
@distinctUnionOfSets: 和@distinctUnionOfArrays差很少, 可是它指望的是一个包含着NSSet对象的NSSet,而且会返回一个NSSet对象。由于集合不能包含重复的值,因此它只有distinct操做。
与对象操做符相似,你们能够本身尝试。