博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
KVC集合操作符
阅读量:6546 次
发布时间:2019-06-24

本文共 2278 字,大约阅读时间需要 7 分钟。

第一次遇到是在阅读AFNetworking中NSURLSession部分代码的时候:

- (NSArray *)tasksForKeyPath:(NSString *)keyPath {     __block NSArray *tasks = nil;     dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);     [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks,     NSArray *uploadTasks, NSArray *downloadTasks) {         if ([keyPath isEqualToString:NSStringFromSelector(@selector(dataTasks))        ]) {             tasks = dataTasks;         } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(            uploadTasks))]) {             tasks = uploadTasks;         } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(            downloadTasks))]) {             tasks = downloadTasks;         } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(            tasks))]) {                         //dataTasks, uploadTasks, downloadTasks 都是数组,相当于打平数组,返回一个包含子数组各元素的数组。            tasks = [@[dataTasks, uploadTasks, downloadTasks] valueForKeyPath:            @"@unionOfArrays.self"];        }        dispatch_semaphore_signal(semaphore);    }];    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);    return tasks; }复制代码

KVC集合运算符允许以key path符号在一个集合中执行方法,以@开头表示一个特定的集合方法。键值编码会在必要的时候把基本数据类型进行装箱或者拆箱

它主要分为3类:1.简单集合操作符 2.对象操作符 3.数组和集合操作符

简单集合操作符

返回string,number等

@max/@min : 获得数组中最大(或者最小)的一个元素,元素内部要支持能够相互比较。这个好像只能是数值类型,系统并没有类似compare的方法,只有isEqual,但是并不是排序用的。

@avg : 将集合中对象转换成double类型,返回数组中指定的平均值的number对象

@sum :将集合中每个对象都转换成double类型,然后计算总和,最后返回一个值为这个总和的NSNumber对象

@count:返回集合中对象总数的NSNumber对象

例子:

[products valueForKeyPath:@"@count"];[products valueForKeyPath:@"@sum.price"];[products valueForKeyPath:@"@avg.price"];[products valueForKeyPath:@"@max.price"];[products valueForKeyPath:@"@min.launchedOn"];复制代码

对象操作符

@unionOfObjects/@distincUnionOfObjects 返回一个由操作符右边的key path指定的对象属性组成的数组,distincUnionOfObjects会对数组去重。

例子:

[inventory valueForKeyPath:@"@unionOfObjects.name"];[inventory valueForKeyPath:@"@distinctUnionOfObjects.name"];复制代码

数组和集合操作符

@distinctUnionOfArrays/@unionOfArrays 返回一个数组,其中包含这个这个数组中每个子数组对于这个操作符号右边指定的key path进行操作之后的值。

经常会使用 array unionOfArrays 来打平多维数组。

@distinctUnionOfSets 和@distinctUnionOfArrays类似,因为NSSet中是没有重复的值,所以只有distinct操作

利用这些操作,有时候可以避免无聊和重复的循环,代码也简洁了很多。

转载于:https://juejin.im/post/5b68175c5188251b157bd4df

你可能感兴趣的文章
网络运维之 EX4200消除var分区使用过高的告警
查看>>
【最好的流程是没有流程】
查看>>
Apache Thrift 教程
查看>>
Python Epoll
查看>>
AS3歌词同步详解
查看>>
单例模式
查看>>
Linux环境NetBeans字体通用抗据齿解决方法
查看>>
Eclipse的花括号(brace)的输入偏好问题
查看>>
工作记录
查看>>
python之重写父类方法
查看>>
cucumber-api安装与试用
查看>>
计算硬件简史
查看>>
JS-两周内自动登录功能
查看>>
jQuery自适应倒计时插件
查看>>
转:JQuery.Ajax之错误调试帮助信息
查看>>
Android KeyCode列表
查看>>
网站爬取工具
查看>>
amazeui学习笔记--css(HTML元素5)--表格Table
查看>>
JavaScript&jQuery.强制类型转换
查看>>
Workgroup下开启Win7的Admin share
查看>>