小谈KVC中KeyPath的集合运算符
由于知识点比较简单,这里不再陈述一大堆的原理,直入主题。
KVC中的集合运算符有以下三类:
1、简单集合运算符:@avg、@sum、@max、@min、@count (只能用在集合对象中,对象属性必须为数字类型)
2、对象操作符:
@unionOfObjects:返回指定属性的值的数组,不去重
@distinctUnionOfObjects:返回指定属性去重后的值的数组
3、数组 / 集体操作符:跟对象操作符很相似,只不过是在NSArray和NSSet所组成的集合中工作的。
@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的集合运算符的更多相关文章
- 小谈JavaScript中this的用法
"this"关键字是JavaScript中广泛应用的一种特性,但它经常也是这门语言中最容易混淆和误解的特性.那么"this"的实际意义是什么?它是如何求值的? ...
- iOS 小谈开发者中的个人、组织(公司、企业)账号
苹果对开发者主要分为3类:个人.组织(公司.企业).教育机构.即: 1.个人(Individual) 2.组织(Organizations) 组织类又分为2个小类: (1)公司(Company) (2 ...
- 浅谈Linux中的信号处理机制(二)
首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...
- 【转】浅谈Java中的hashcode方法(这个demo可以多看看)
浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...
- 【转】浅谈Java中的hashcode方法
哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个 ...
- 谈 JavaScript 中的强制类型转换 (2. 应用篇)
这一部分内容是承接上一篇的, 建议先阅读谈 JavaScript 中的强制类型转换 (1. 基础篇) 前两章讨论了基本数据类型和基本包装类型的关系, 以及两个在类型转换中十分重要的方法: valueO ...
- 浅谈 .NET 中的对象引用、非托管指针和托管指针 理解C#中的闭包
浅谈 .NET 中的对象引用.非托管指针和托管指针 目录 前言 一.对象引用 二.值传递和引用传递 三.初识托管指针和非托管指针 四.非托管指针 1.非托管指针不能指向对象引用 2.类成员指针 五 ...
- 浅谈Java中的hashcode方法(转)
原文链接:http://www.cnblogs.com/dolphin0520/p/3681042.html 浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地 ...
- 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂
浅谈JS中的!=.== .!==.===的用法和区别 var num = 1; var str = '1'; var test = 1; test == num //tr ...
随机推荐
- 使用国内镜像加速下载Android SDK
本文转自:http://blog.kuoruan.com/24.html.感谢原作者. 什么是Android SDK SDK:(software development kit)软件开发工具包.被软件 ...
- SQL Server代理(2/12):作业步骤和子系统
SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. SQL Server代理作业有一系列的一个 ...
- 总结Unity IOC容器通过配置实现类型映射的几种基本使用方法
网上关于Unity IOC容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择. 首先讲一下通过代码来进行类型映射,很简单,代码如下: unityContainer = new Un ...
- 转[开发环境配置]在Ubuntu下配置舒服的Python开发环境
在Ubuntu下配置舒服的Python开发环境 Ubuntu 提供了一个良好的 Python 开发环境,但如果想使我们的开发效率最大化,还需要进行很多定制化的安装和配置.下面的是我们团队开发人员推荐的 ...
- Fiddler使用AutoResponder进行本地文件和线上文件的映射
直入正题.. 刚刚想写篇总结,照常登上博客园添加新随笔,写了百来字发现有什么不对劲 编辑器去哪儿了... 心想重新登录应该就OK了吧,点击退出然后重新登录 按钮一直显示加载中...简直就没法登录嘛.. ...
- LINQ的Contains方法
此方法,判断集合中是否包含有某一元素. source code: Enumerable.Where(stringArray, n => n.Contains("t"));
- Socket开发框架之数据加密及完整性检查
在前面两篇介绍了Socket框架的设计思路以及数据传输方面的内容,整个框架的设计指导原则就是易于使用及安全性较好,可以用来从客户端到服务端的数据安全传输,那么实现这个目标就需要设计好消息的传输和数据加 ...
- ASP.Net中防止页面刷新重复提交的几种方法
[摘要] 目前很多网站都要提交页面插入或更新数据库,比如留言本,一个用户提交留言后,如果按F5,就会重新提交一遍留言,导致数据库出现两条一模一样的留言,本文介绍了几种防止页面刷新,导致重复提交数据的方 ...
- 【UWP】UI适配整理
做UWP有几个月了,期间发布了几个应用,在这里整理一下适配相关的一些东西,UWP关于UI的适配主要有两种方式: 1.VisualState+Trigger:通过触发器出发界面更变,通常在Desktop ...
- 【Java每日一题】20161028
package Oct2016; public class Ques1028 { public static void main(String[] args){ new B().out(); // 输 ...