妙用valueForKeyPath
valueForKey与valueForKeyPath在KVC中同时出现,都可以使用,难免让开发者迷惑;心里知道肯定是不一样,但具体的用法你会吗?其实valueForKeyPath的功能更强大,支持深层次结构的调用和特殊用法,下面展示其在对象操作符中的使用。
对象操作符有三类:
- 聚合操作符(Aggregation Operators):
依据对集合里的每一个对象的同一属性的指定操作,返回该属性被操作后的值
- 数组操作符(Array Operators):
依据某一条件取出每一个对象的同一属性,组成一个新数组返回。
- 嵌套操作符(Nesting Operators):
处理一个包含集合的集合,返回形式是NSArray或NSSet
示例1:
聚合操作符@avg,@count,@max,@min,@sum的使用。
假如有一个学生集合,学生有一个grade属性,那么我们用上述的五个操作符对grade进行操作。
返回学生的平均成绩:
NSNumber *gradeAverage = [self.students valueForKeyPath:@"@avg.grade"];
返回学生的成绩份数:
NSNumber *gradeCount = [self.students valueForKeyPath:@"@count"];
示例2:
数组操作符@distinctUnionOfObjects,@unionOfObjects的使用。
还是上面的学生集合,假设他们的成绩分别是99,98,98,96,92。
返回去重成绩集合:99,98,96,92
NSArray *distinctGrades = [self.students valueForKeyPath:@"@distinctUnionOfObjects.grade"];
返回不去重成绩集合:99,98,98,96,92
NSArray *unionGrades = [self.students valueForKeyPath:@"@unionOfObjects.grade"];
示例3:
嵌套操作符@distinctUnionofArrays,@unionOfArrays,@distinctUnionOfSets的使用。
继续用上文的学生集合,再领创建一个学生集合包含99,97,95三个成绩。然后组成一个集合的集合
NSArray *arrayOfAyyays = @[self.students, self.moreStudents]。
返回去重成绩集合:99,98,96,92,97,95,将students和morestudents合并后去重。
NSArray *collectedDistinctGrades= [arrayOfAyyays valueForKeyPath:@"@distinctUnionOfArrays.grade"];
返回不去重成绩集合:99,98,98,96,92,99,97,95
NSArray *collectedGrades = [arrayOfAyyays valueForKeyPath:@"@unionOfArrays.grade"];
@distinctUnionOfSets的效果类似于@distinctUnionOfArrays,只不过是Set里包含Set,这里就不写了。
当然valueForKeyPath也可以当作“.”语法来使用,但是现在编码基本使用属性,赋值取值都是用的“.”语法,用valueForKeyPath这个方法反而书写更耗时。不过像上文中对数组的操作使用该方法会减少很多代码量,也节省时间,又能避免自己书写时的疏忽,还是值得推荐。
妙用valueForKeyPath的更多相关文章
- valueForKeyPath的妙用(转)
可能大家对 - (id)valueForKeyPath:(NSString *)keyPath 方法不是很了解. 其实这个方法非常的强大,举个例子: NSArray *array = @[@" ...
- 【CSS进阶】伪元素的妙用--单标签之美
最近在研读 <CSS SECRET>(CSS揭秘)这本大作,对 CSS 有了更深层次的理解,折腾了下面这个项目: CSS3奇思妙想 -- Demo (请用 Chrome 浏览器打开,非常值 ...
- angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用
今天我们要讲的是ng2的路由系统. 例子
- JavaScript的妙与乐(一)之 函数优化
JavaScript的妙与乐系列文章主要是展示一些JavaScript上面比较好玩一点的特性和一些有用的技巧,里面很多内容都是我曾经在项目中使用过的一些内容(当然,未必所有技巧的使用频率都很高^_^) ...
- Promise的前世今生和妙用技巧
浏览器事件模型和回调机制 JavaScript作为单线程运行于浏览器之中,这是每本JavaScript教科书中都会被提到的.同时出于对UI线程操作的安全性考虑,JavaScript和UI线程也处于同一 ...
- 【CSS进阶】伪元素的妙用2 - 多列均匀布局及title属性效果
最近无论是工作还是自我学习提升都很忙,面对长篇大论的博文总是心有余而力不足,但又不断的接触学习到零碎的但是很有意义的知识点,很想分享给大家,所以本篇可能会很短. 本篇接我另一篇讲述 CSS 伪元素的文 ...
- 不太被人提起的%%lockres%%的妙用
%%lockres%% 这个值似乎很少被大家提到,甚至微软在官方文档中. 它返回是一个Hash Value,看乎这个值没什么用. 后来在实践也有它的妙用之处,比如在出现性能问题如LOCK时,一般先通过 ...
- 【优雅代码】深入浅出 妙用Javascript中apply、call、bind
这篇文章实在是很难下笔,因为网上相关文章不胜枚举. 巧合的是前些天看到阮老师的一篇文章的一句话: “对我来说,博客首先是一种知识管理工具,其次才是传播工具.我的技术文章,主要用来整理我还不懂的知识.我 ...
- 【javascript 技巧】Array.prototype.slice的妙用
Array.prototype.slice的妙用 开门见山,关于Array 的slice的用法可以参考这里 http://www.w3school.com.cn/js/jsref_slice_arra ...
随机推荐
- oracle 表 库实例 空间
地址 http://blog.csdn.net/g15738290530/article/details/51859048 1:个人理解 数据库可以有多个实例,其中 orcl 为默认 一般情况下,一个 ...
- 树状数组 || JZOI 1024. @szefany 的树
题面:无 题解:无 代码: #include<cstdio> #include<cstring> #include<iostream> #include<al ...
- 这样,可以在firefox播放flash了
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="62" heigh ...
- 实验八 Web基础 SQL注入原理
实验八 Web基础 实验要求 (1)Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. (2)Web前端javascipt ...
- 微信小程序--地图组件与api-模拟器上返回的scale 与真机上不同--bindregionchange触发图标一直闪现问题
场景:根据地理定位获取不同地区的充电桩位置,要求 1.平移的时候,跟随坐标变化展示不同区域的坐标点信息 2.不同的缩放等级,14以下,展示聚合点数据,14以上,展示真正的站点信息: 3.点击聚合点的时 ...
- 初步学习python
自计算机诞生以来,也伴随着计算机语言的诞生,现在,全世界的编程语言有600多种,但流行的编程语言也就20多种. Java和C一直占据着前两名.但是近年来伴随着人工智能的发展,Python发展迅猛,以其 ...
- 一键启动frida server的cmd脚本
和以前写过的在pc直接操作的手机端的sqlite的脚本类似,需要用到重定向的命令 frida-server_helper.bat su /data/local/tmp/frida-server fri ...
- Mybatis+Mysql逆向工程
目录结构: pom文件: <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&quo ...
- 匹配字符串中的s开头的单词,并替换
String s="now it's sping,but today is so cold!"; String a=s.replaceAll("s\\w+",& ...
- mysql储存过程入门学习
转载至:https://www.yiibai.com/mysql/getting-started-with-mysql-stored-procedures.html 1.mysql储存过程的创建 DE ...