KVC Collection Operators(集合操作)
2016-07-19 00:35
357 查看
KVC Collection Operators(集合操作)
集合操作:一个集合/数组通过调用valueForKeyPath:可允许一个集合中的对象属性根据集合操作符做相应的操作。集合操作符是一个以
@开头特殊的字符串,下面是集合操作的格式插图(来自官方文档):
注意:所有的集合操作,除了
@count,其他都需要有右边的keyPath(一般为属性名),目前还不支持自定义集合操作符。
集合操作符分为三种:
简单的集合操作 返回NSString、NSNumber、NSDate对象操作符 返回NSArray
数组或集合操作符 返回NSArray、NSSet
Simple Collection Operators(简单的操作符)
@avg 平均值@count 个数
@max 最大值
@min 最小值
@sum 和
下面通过一个例子来了解简单的操作符用法:
现在有一个学生类(Student),有一个身高(height)属性
@interface Student : NSObject /** 身高 */ @property (nonatomic, assign) float height; @end
示例代码:
// 创建6个学生对象 NSMutableArray *students = [NSMutableArray array]; for (int i = 0; i < 6; i++) { Student *student = [[Student alloc] init]; student.height = 1.6 + 0.04 * arc4random_uniform(4); [students addObject:student]; } // 平均身高 float avg = [[students valueForKeyPath:@"@avg.height"] floatValue]; // 身高总和 float sum = [[students valueForKeyPath:@"@sum.height"] floatValue]; // 最大值 float max = [[students valueForKeyPath:@"@max.height"] floatValue]; // 最小值 float min = [[students valueForKeyPath:@"@min.height"] floatValue]; // 个数 float count = [[students valueForKeyPath:@"@count"] floatValue]; NSLog(@"\n avg: %f\n sum: %f\n max :%f\n min :%f\n count :%f", avg, sum, max, min, count);
提示:你可以简单地通过吧self作为操作符后面的key path来获取有NSNunber组成的数组或者集合的总值,例如[@[@(1), @(2), @(3)] valueForKeyPath:@”@max.self”] 来自Objective Sea
Object Operator (对象操作符)
@distinctUnionOfObjects 返回一个由操作符右边的key path所指定的对象属性组成的数组,不对数组去重@unionOfObjects 返回一个由操作符右边的key path所指定的对象属性组成的数组,并对数组去重
示例代码:
// 创建8个一班的学生对象 NSMutableArray *studentsOfClassOne = [NSMutableArray array]; for (int i = 0; i < 8; i++) { Student *student = [[Student alloc] init]; student.height = 1.6 + 0.04 * arc4random_uniform(6); [studentsOfClassOne addObject:student]; } // 创建8个二班的学生对象 NSMutableArray *studentsOfClassTwo = [NSMutableArray array]; for (int i = 0; i < 8; i++) { Student *student = [[Student alloc] init]; student.height = 1.6 + 0.01 * arc4random_uniform(6); [studentsOfClassTwo addObject:student]; } NSLog(@"一班的学生身高(不去重) :"); NSArray *resultsOne = [studentsOfClassOne valueForKeyPath:@"@unionOfObjects.height"]; [studentsOfClassTwo valueForKeyPath:@"@unionOfObjects.height"]; for (id result in resultsOne) { NSLog(@"%@ ", result); } NSLog(@"二班的学生身高(去重) :"); NSArray *resultsTwo = [studentsOfClassTwo valueForKeyPath:@"@distinctUnionOfObjects.height"]; for (id result in resultsTwo) { NSLog(@"%@ ", result); }
Array and Set Operators(数组和集合操作符)
@distinctUnionOfArrays/ @unionOfArrays: 返回NSArray,distinct版本会对数组取重@distinctUnionOfSets: 返回一个NSSet对象,因为集合不能包含重复的值,所以它只有distinct操作。
// 创建8个一班的学生对象 NSMutableArray *studentsOfClassOne = [NSMutableArray array]; for (int i = 0; i < 8; i++) { Student *student = [[Student alloc] init]; student.height = 1.6 + 0.04 * arc4random_uniform(6); [studentsOfClassOne addObject:student]; } // 创建8个二班的学生对象 NSMutableArray *studentsOfClassTwo = [NSMutableArray array]; for (int i = 0; i < 8; i++) { Student *student = [[Student alloc] init]; student.height = 1.6 + 0.01 * arc4random_uniform(6); [studentsOfClassTwo addObject:student]; } NSLog(@"一班的学生身高(不去重) :"); NSArray *resultsOne = [studentsOfClassOne valueForKeyPath:@"@unionOfObjects.height"]; [studentsOfClassTwo valueForKeyPath:@"@unionOfObjects.height"]; for (id result in resultsOne) { NSLog(@"%@ ", result); } NSLog(@"二班的学生身高(不去重) :"); NSArray *resultsTwo = [studentsOfClassTwo valueForKeyPath:@"@unionOfObjects.height"]; for (id result in resultsTwo) { NSLog(@"%@ ", result); } NSLog(@"------------去重后------------"); // 去除相同值的数组 NSArray *distinctResults = [@[studentsOfClassOne, studentsOfClassTwo] valueForKeyPath:@"@distinctUnionOfArrays.height"]; NSLog(@"%@", distinctResults);
总结
KVC集合运算符是一个想节省几行代码并在这一过程中看起来很酷的人必须要了解的。如果想要有更深层次的了解,可以去看苹果官方文档Collection Operators相关文章推荐
- 关于apache2.4 模块 mod_php mod_fastcgi mod_fcgi
- Linux--管道pipe
- Linux常用指令 2
- Ubuntu 16.04 Desktop不能识别USB设备的问题
- linux 命令(1)mkdir
- linux--03
- 0142 nginx搭建rtmp协议流媒体服务器总结
- 利用SharePoint 2013 创建Service Desk 网站之二线工程师问题处理!
- 阿里云Linux服务器安装配置ftp及上传网站全教程
- Linux 平台相关代码的 C++ 解决方案
- hadoop2.7.1环境搭建
- Dockerfile指令
- Centos7最小安装后ssh连接Connection was reset.问题
- 在Centos上安装redmine
- Nginx 工作原理和优化、漏洞
- 智能网站搭建(一)数据埋点
- 五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
- mysql中select某表时排除个别字段,shell实现
- 利用python的paramiko模块,自定义函数远程批量执行shell命令
- Linux客户端Xmanager使用技巧