小谈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 ...
随机推荐
- 多个ajax请求下等待条显示和隐藏的简单处理
处理为遇到ajax请求就显示等待条,直到所有的ajax请求执行完毕才关闭等待条.比较简单,源码如下(基于jQuery) //基于jQuery //从第一个ajax请求发出开始显示等待条?直到一系列aj ...
- MVC过滤器的用法
APS.NET MVC中的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理.这时候就用到了过滤器. 在Asp.netMvc中当你有以下及类似 ...
- jQuery Ajax实现下拉框无刷新联动
HTML代码: @{ Layout = null; } @using DAL; @using System.Data; @{ AreaDal areaDal = new AreaDal(); stri ...
- C#的类,构造函数以及Array阵列的数据填充与绑定
今天学习,如标题. 创建一个类,字段属性构造函数: Source code: using System; using System.Collections.Generic; using System. ...
- ASP.NET Core开发-读取配置文件Configuration
ASP.NET Core 是如何读取配置文件,今天我们来学习. ASP.NET Core的配置系统已经和之前版本的ASP.NET有所不同了,之前是依赖于System.Configuration和XML ...
- Failed to create the Java Virtual Machine.问题的解决
运行Eclipse,出现了"Failed to create the Java Virtual Machine."错误: 解决的办法是在Eclipse的解压目录下找到eclipse ...
- Android使用SAX解析XML(2)
school类包含了一个major列表,可以增加该列表的元素,以及返回该列表,还实现了Parcelable.Creator接口. package com.hzhi.my_sax; import jav ...
- PopupWindow的使用
如图是效果图 2种常用PopupWindow的使用 下载地址:http://download.csdn.net/detail/qq_29774291/9683258 第一个展示一个下拉的Lis ...
- HR人力资源战略流程制定
HR人力资源战略 是指根据企业总体战略的要求,为适应企业生存和发展的需要,对企业人力资源进行开发,提高职工队伍的整体素质,从中发现和培养出一大批优秀人才,所进行的长远性的人力资源管理方面的专业谋划和方 ...
- Java经典实例:按字符颠倒字符串
使用StringBuilder类的reverse()方法来实现. /** * Created by Frank */ public class StringRevChar { public stati ...