Objective-C中KVC的集合操作符

键值编码(KVC)集合操作(Collection Operators)提供了一种非常简洁的运算方法,可以有效避免使用循环,如for,while或快速枚举。

这些方法包括三种类型,简单集合运算符、对象操作符、数组和集合操作符。Apple不允许自定义集合操作符,但实际上利用swizzle黑魔法,可以做到自定义操作符。有兴趣可以参考http://kickingbear.com/blog/archives/9

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

    @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一样,但是返回的是集合中的最小值。

假设一个Product类,如下所示

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



数据如下图所示,组成一个products数组,这里省略了初始化一个Product对象,并添加至products数组的代码,请自行脑补。

那么使用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



可以这样理解,以其中一个为例。@sum.price,price是product的一个属性。@sum的@符号意味着后面将进行运算,@sum通知KVC机制进行总和计算。


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

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

有以下数组,每个数组成员都是一个Product类对象。

 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"



可以看到 @distinctUnionOfObjects剔除了重复成员数据,而@unionOfObjects保留了全部。

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

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

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

与对象操作符类似,大家可以自己尝试。



转载于:https://my.oschina.net/u/2392723/blog/639013

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值