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的更多相关文章

  1. valueForKeyPath的妙用(转)

    可能大家对 - (id)valueForKeyPath:(NSString *)keyPath 方法不是很了解. 其实这个方法非常的强大,举个例子: NSArray *array = @[@" ...

  2. 【CSS进阶】伪元素的妙用--单标签之美

    最近在研读 <CSS SECRET>(CSS揭秘)这本大作,对 CSS 有了更深层次的理解,折腾了下面这个项目: CSS3奇思妙想 -- Demo (请用 Chrome 浏览器打开,非常值 ...

  3. angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

    今天我们要讲的是ng2的路由系统. 例子

  4. JavaScript的妙与乐(一)之 函数优化

    JavaScript的妙与乐系列文章主要是展示一些JavaScript上面比较好玩一点的特性和一些有用的技巧,里面很多内容都是我曾经在项目中使用过的一些内容(当然,未必所有技巧的使用频率都很高^_^) ...

  5. Promise的前世今生和妙用技巧

    浏览器事件模型和回调机制 JavaScript作为单线程运行于浏览器之中,这是每本JavaScript教科书中都会被提到的.同时出于对UI线程操作的安全性考虑,JavaScript和UI线程也处于同一 ...

  6. 【CSS进阶】伪元素的妙用2 - 多列均匀布局及title属性效果

    最近无论是工作还是自我学习提升都很忙,面对长篇大论的博文总是心有余而力不足,但又不断的接触学习到零碎的但是很有意义的知识点,很想分享给大家,所以本篇可能会很短. 本篇接我另一篇讲述 CSS 伪元素的文 ...

  7. 不太被人提起的%%lockres%%的妙用

    %%lockres%% 这个值似乎很少被大家提到,甚至微软在官方文档中. 它返回是一个Hash Value,看乎这个值没什么用. 后来在实践也有它的妙用之处,比如在出现性能问题如LOCK时,一般先通过 ...

  8. 【优雅代码】深入浅出 妙用Javascript中apply、call、bind

    这篇文章实在是很难下笔,因为网上相关文章不胜枚举. 巧合的是前些天看到阮老师的一篇文章的一句话: “对我来说,博客首先是一种知识管理工具,其次才是传播工具.我的技术文章,主要用来整理我还不懂的知识.我 ...

  9. 【javascript 技巧】Array.prototype.slice的妙用

    Array.prototype.slice的妙用 开门见山,关于Array 的slice的用法可以参考这里 http://www.w3school.com.cn/js/jsref_slice_arra ...

随机推荐

  1. oc与c语言的相互调用

    一:OC调用C语言 C语言的.h文件 // // TestPrint.h // TestDemo // // Created by Techsun on 14-8-12. // Copyright ( ...

  2. asch相关的linux基础知识分享

    本文针对的人群:会用putty.SecureCRT.xhsell等工具ssh连接到自己的asch服务器上,但不怎么会执行命令的人.高手请绕路~ 本文主要围绕受托人搭建.维护涉及相关的内容进行Linux ...

  3. [daily]gtk程序不跟随系统的dark主题

    问题描述: 我的系统主题是dark的.在使用mysql-workbench是,里边的一些线条就跟随了系统文字的主要使用了灰白色. 这样在白色画布里就看不见这些线条了. 方法: 设置mysql-work ...

  4. 审核被拒Guideline 2.1 - Information Needed we are unable to find 账号登录 option

    Guideline 2.1 - Information Needed We were unable to sign in to review your app with the demo accoun ...

  5. Redis做LRU缓存

    当Redis用作缓存时,通常可以让它在添加新数据时自动逐出旧数据. 这种行为在开发人员社区中非常有名,因为它是流行的memcached系统的默认行为. LRU实际上只是支持的驱逐方法之一. 本页介绍了 ...

  6. Linux(CentOs 7)系统重装笔记(二)---完全删除用户账号和root用户登录

    参考网址:https://jingyan.baidu.com/article/046a7b3ede1c38f9c27fa91b.html 一.完全删除用户 1.查看要删除的用户账号信息 find / ...

  7. jq点击事件未生效

    jq点击事件未生效,应写成事件委托的方式 // $(function(){ // $('.current a').on("click", function(){ // $(this ...

  8. 用python脚本获取运行环境中的module 列表

    由于脚本运行在远程环境,总报错说一些module没有.所以决定彻底对环境进行一次摸底. 于是,用如下代码即可实现: #!/usr/bin/env python import sys try: #pri ...

  9. linux 返回上次历史目录

    我们使用linux的转换目录命令 cd 时经常会遇到想回到cd之前目录的情况,比如不小心按了 cd 回车,跳出了工作目录,又想回到刚刚的目录. 这种情况下,就用到了我们这篇博客的主角 cd - . c ...

  10. Python数据分析matplotlib可视化之绘图

    Matplotlib是一个基于python的2D画图库,能够用python脚本方便的画出折线图,直方图,功率谱图,散点图等常用图表,而且语法简单. Python中通过matplotlib模块的pypl ...