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

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. 一个java页游服务器框架

    一.前言 此游戏服务器架构是一个单服的形式,也就是说所有游戏逻辑在一个工程里,没有区分登陆服务器.战斗服务器.世界服务器等.此架构已成功应用在了多款页游服务器 .在此框架中没有实现相关业务逻辑,只有简 ...

  2. svn冲突问题详解

    开发人员都知道代码管理工具是开发中一个必不可少的工具,这里也不废话详细介绍了.不管你个人喜欢git还是svn还是其他,但还有一大部分公司在使用svn做代码管理工具.这里详细介绍下SVN提交文件时冲突问 ...

  3. Windows Azure Web Site (11) 使用源代码管理器管理Azure Web Site

    <Windows Azure Platform 系列文章目录> 熟悉Azure Web Site平台的读者都知道,我们可以通过FTP等方式,把本地的Web Application部署到微软 ...

  4. 我如何调优SQL Server查询

    我是个懒人,我只想干尽可能少的活.当我干活的时候我不想太多.是,你没看错,这看起来很糟糕,作为一个DBA这很不合格.但在今天的文章里,我想给你展示下,当你想对特定查询创建索引设计时,你如何把你的工作和 ...

  5. 实现在GET请求下调用WCF服务时传递对象(复合类型)参数

    WCF实现RESETFUL架构很容易,说白了,就是使WCF能够响应HTTP请求并返回所需的资源,如果有人不知道如何实现WCF支持HTTP请求的,可参见我之前的文章<实现jquery.ajax及原 ...

  6. block,inline,inline-block的区别

    block: 英语翻译过来是“块”意思,就跟小时候玩过的积木方块一样,一块一块往上搭. inline: 英语翻译过来就是“内联”的意思,内联不好理解,我的理解就是行内元素: block和inline都 ...

  7. LINQ的Intersect方法

    找到两个集合中交集部分: source code: IEnumerable<int> a = new List<int>{ { }, { }, { } }; IEnumerab ...

  8. Socket开发框架之数据加密及完整性检查

    在前面两篇介绍了Socket框架的设计思路以及数据传输方面的内容,整个框架的设计指导原则就是易于使用及安全性较好,可以用来从客户端到服务端的数据安全传输,那么实现这个目标就需要设计好消息的传输和数据加 ...

  9. Entity Framework 实体框架的形成之旅--利用Unity对象依赖注入优化实体框架(2)

    在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...

  10. .net概念之程序集说明

    一.程序集的一些基本概念: 程序集是包含一个或多个类型定义文件和资源文件的集合.它允许我们分离可重用类型的逻辑表示和物理表示. 程序集是一个可重用.可实施版本策略和安全策略的单元.它允许我们将类型和资 ...