小谈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 ...
随机推荐
- 移植SlidingMenu Android library,和安装example出现的问题解决
很多项目都用到类似左侧滑动菜单的效果,比如facebook,evernote,VLC for android等等,这很酷 源代码可以从GitHub的https://github.com/jfeinst ...
- TCP与UDP在socket编程中的区别
一.TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) UDP程序结构较简单 流模式与数据报模式 TCP保证数据正确性,UDP可能丢包 TCP保证数据顺序,UD ...
- [New Portal]Windows Azure Virtual Machine (15) 在本地制作数据文件VHD并上传至Azure(2)
<Windows Azure Platform 系列文章目录> 在上一章内容里,我们已经将包含有OFFICE2013 ISO安装文件的VHD上传至Azure Blob Storage中了. ...
- WCF服务创建与使用(双工模式)
昨天发布了<WCF服务创建与使用(请求应答模式)>,今天继续学习与强化在双工模式下WCF服务创建与使用,步骤与代码如下. 第一步,定义服务契约(Service Contract),注意Se ...
- StringExtensions
public static string MakeSafeSql(this string s) { string t = s; t = t.Replace("'", "' ...
- SQL_递归查询(复杂查询示例)
需求: 一篇文章里有很多评论,每个评论又有很多回复评论,要求: 页面将文章展示出来,且文章的主评论按照评论时间分页展示,回复评论的评论完全展示在每个主评论下面,且按照回复时间排序 最终查询结果SQL查 ...
- 做10年Windows程序员与做10年Linux程序员的区别
如果一个程序员从来没有在linux,unix下开发过程序,一直在windows下面开发程序, 同样是工作10年, 大部分情况下与在linux,unix下面开发10年的程序员水平会差别很大.我写这篇文章 ...
- 最小生成树---Kruskal/Prime算法
1.Kruskal算法 图的存贮采用边集数组或邻接矩阵,权值相等的边在数组中排列次序可任意,边较多的不很实用,浪费时间,适合稀疏图. 方法:将图中边按其权值由小到大的次序顺序选取,若选边后不 ...
- Asp.Net WebService 使用后来管理系统对接口方法进行公开控制
思路: 1.需要找一个访问Webservice的统一入口,刚开始进入了一个误区,以为WebService是单独的运行程序,后来经朋友提醒,其实它也是通过http请求在asp.net framework ...
- 用dos开启apache问题说明