由于知识点比较简单,这里不再陈述一大堆的原理,直入主题。

KVC中的集合运算符有以下三类:

1、简单集合运算符:@avg、@sum、@max、@min、@count (只能用在集合对象中,对象属性必须为数字类型)

    2、对象操作符:

               @unionOfObjects:返回指定属性的值的数组,不去重

               @distinctUnionOfObjects:返回指定属性去重后的值的数组

    3、数组 / 集体操作符:跟对象操作符很相似,只不过是在NSArrayNSSet所组成的集合中工作的。

               @unionOfArrays:返回一个数组,值由各个子数组的元素组成,不去重

               @distinctUnionOfArrays:返回一个数组,值由各个子数组的元素组成,去重

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

上代码:

场景:有一个Person类,有name和age两个属性。实例化5个对象,求其平均年龄、年龄总和、最大年龄和最小年龄。

Person类头文件:

 #import <Foundation/Foundation.h>

 @interface Person : NSObject

 /**
姓名
*/
@property(nonatomic,copy) NSString *name; /**
年龄
*/
@property(nonatomic,assign) NSInteger age; /**
自定义构造函数 @param name 姓名
@param age 年龄 @return 返回Person的对象
*/
- (instancetype)initWithName:(NSString *)name andAge:(NSInteger)age; @end

Person的.m文件:

 #import "Person.h"

 @implementation Person

 - (instancetype)initWithName:(NSString *)name andAge:(NSInteger)age{
if(self = [super init]){
_name = name;
_age = age;
}
return self;
} @end

控制器调用Person对象实现功能:

 @interface ViewController ()

 @end

 @implementation ViewController

 - (void)viewDidLoad {
[super viewDidLoad]; Person *p1 = [[Person alloc] initWithName:@"xiaoming" andAge:];
Person *p2 = [[Person alloc] initWithName:@"xiaoming" andAge:];
Person *p3 = [[Person alloc] initWithName:@"xiaohong" andAge:];
Person *p4 = [[Person alloc] initWithName:@"xiaoli" andAge:];
Person *p5 = [[Person alloc] initWithName:@"xiaoli" andAge:]; // 简单集合运算符不能用在单个对象中,所以这里会报错
// int res = [[p1 valueForKeyPath:@"@sum.age"] integerValue]; NSArray *perArray = @[p1, p2, p3, p4, p5]; // 简单集合运算符
NSInteger avg = [[perArray valueForKeyPath:@"@avg.age"] integerValue];
NSInteger sum = [[perArray valueForKeyPath:@"@sum.age"] integerValue];
NSInteger max = [[perArray valueForKeyPath:@"@max.age"] integerValue];
NSInteger min = [[perArray valueForKeyPath:@"@min.age"] integerValue]; // count:取数组中元素的个数,下面 3 种写法等价
NSInteger count = [[perArray valueForKeyPath:@"@count.age"] integerValue];
NSInteger count1 = [[perArray valueForKeyPath:@"@count"] integerValue];
NSInteger count2 = perArray.count; // 对象操作符:对数组对象进行操作
// @unionOfObjects:返回指定属性的值的数组,不去重
// @distinctUnionOfObjects:返回指定属性去重后的值的数组
NSArray<NSString *> *nameArray = [perArray valueForKeyPath:@"@unionOfObjects.name"];
NSArray<NSString *> *nameArray2 = [perArray valueForKeyPath:@"@distinctUnionOfObjects.name"]; // 数组 / 集体操作符 : 对由NSArray和NSSet所组成的集合操作
// unionOfArrays:返回一个数组,值由各个子数组的元素组成,不去重
// distinctUnionOfArrays:返回一个数组,值由各个子数组的元素组成,去重
// distinctUnionOfSets:和distinctUnionOfArrays差不多, 只是它期望的是一个包含着NSSet对象的NSSet,并且会返回一个NSSet对象。因为集合不能包含重复的值,所以它只有distinct操作。
Person *P1 = [[Person alloc] initWithName:@"PP1" andAge:];
Person *P2 = [[Person alloc] initWithName:@"PP1" andAge:];
Person *P3 = [[Person alloc] initWithName:@"PP2" andAge:];
Person *P4 = [[Person alloc] initWithName:@"PP3" andAge:];
Person *P5 = [[Person alloc] initWithName:@"PP3" andAge:];
NSArray *perArray2 = @[P1, P2, P3, P4, P5]; NSArray *arr1 = [@[perArray,perArray2] valueForKeyPath:@"@unionOfArrays.name"];
NSArray *arr2 = [@[perArray,perArray2] valueForKeyPath:@"@distinctUnionOfArrays.name"];
} @end

小谈KVC中KeyPath的集合运算符的更多相关文章

  1. 小谈JavaScript中this的用法

    "this"关键字是JavaScript中广泛应用的一种特性,但它经常也是这门语言中最容易混淆和误解的特性.那么"this"的实际意义是什么?它是如何求值的? ...

  2. iOS 小谈开发者中的个人、组织(公司、企业)账号

    苹果对开发者主要分为3类:个人.组织(公司.企业).教育机构.即: 1.个人(Individual) 2.组织(Organizations) 组织类又分为2个小类: (1)公司(Company) (2 ...

  3. 浅谈Linux中的信号处理机制(二)

    首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...

  4. 【转】浅谈Java中的hashcode方法(这个demo可以多看看)

    浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...

  5. 【转】浅谈Java中的hashcode方法

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个 ...

  6. 谈 JavaScript 中的强制类型转换 (2. 应用篇)

    这一部分内容是承接上一篇的, 建议先阅读谈 JavaScript 中的强制类型转换 (1. 基础篇) 前两章讨论了基本数据类型和基本包装类型的关系, 以及两个在类型转换中十分重要的方法: valueO ...

  7. 浅谈 .NET 中的对象引用、非托管指针和托管指针 理解C#中的闭包

    浅谈 .NET 中的对象引用.非托管指针和托管指针   目录 前言 一.对象引用 二.值传递和引用传递 三.初识托管指针和非托管指针 四.非托管指针 1.非托管指针不能指向对象引用 2.类成员指针 五 ...

  8. 浅谈Java中的hashcode方法(转)

    原文链接:http://www.cnblogs.com/dolphin0520/p/3681042.html 浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地 ...

  9. 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂

    浅谈JS中的!=.== .!==.===的用法和区别   var num = 1;     var str = '1';     var test = 1;     test == num  //tr ...

随机推荐

  1. github代码管理工具的使用方法

    一.创建一个存储库 1.点击页面右上方你的用户名右边的+标志,然后点击下拉列表中的"new repository"选项,一般填写项目名称和选择public 和选择初始化有READM ...

  2. select查询时,如何把指定的行放置在最前面

    可以用case when做一个列,然后根据这个列来排序,下面给出代码 ' end) as 'abc' from table order by abc

  3. JAVA 设计模式 模板方法模式

    定义 模板方法模式 (Template Method) 定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成. 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模 ...

  4. SQL Server代理(8/12):使用SQL Server代理外部程序

    SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 在这个系列的上篇文章里,你学习如何使用SQ ...

  5. ECharts+百度地图网络拓扑应用

    前一篇谈及到了ECharts整合HT for Web的网络拓扑图应用,后来在ECharts的Demo中看到了有关空气质量的相关报表应用,就想将百度地图.ECharts和HT for Web三者结合起来 ...

  6. ASP.NET MVC必知必会知识点总结(二)

    一.实现Controller的依赖注入: 1.自定义继承DefaultControllerFactory 类的控制器工厂类并重写GetControllerInstance方法:(如:InjectCon ...

  7. Git for Windows v2.11.0 Release Notes

    homepage faq contribute bugs questions Git for Windows v2.11.0 Release Notes Latest update: December ...

  8. 【转】万网域名查询接口(API)的说明

    1.域名查询接口采用HTTP,POST,GET协议:调用URL:http://panda.www.net.cn/cgi-bin/check.cgi参数名称:area_domain 值为标准域名,例:h ...

  9. 全动态Portlet点击后选中样式

    1  背景概述 在配置公司云平台的帮助信息过程中,由于使用的全动态portlet的数据URL获取到的是静态数据,没有办法在后台做选中的逻辑判断,所以需要在前台来控制选中列表的样式,这里将对前台选中列表 ...

  10. android布局属性详解

    RelativeLayout用到的一些重要的属性: 第一类:属性值为true或false android:layout_centerHrizontal  水平居中 android:layout_cen ...