妙用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这个方法反而书写更耗时。不过像上文中对数组的操作使用该方法会减少很多代码量,也节省时间,又能避免自己书写时的疏忽,还是值得推荐。

原文地址:https://www.cnblogs.com/xuanyishare/p/9404531.html

时间: 2024-10-09 11:51:39

妙用valueForKeyPath的相关文章

valueForKeyPath的妙用(转)

可能大家对 - (id)valueForKeyPath:(NSString *)keyPath 方法不是很了解. 其实这个方法非常的强大,举个例子: NSArray *array = @[@"name", @"w", @"aa", @"jimsa"]; NSLog(@"%@", [array valueForKeyPath:@"uppercaseString"]); 输出 ( NAME,

《众妙之门——精通CSS3》一书知识点剖析

不得不佩服京东的速度,昨天刚下单的两本书今天上午就到了.其中一本是全彩页的<众妙之门 - 精通CSS3>,细看了前几十页,书上的叙述方式给我的印象其实不如“彩页”来的讨喜——接连说上几个例子,扔个例子的链接(没源码下载,要自己手动输入,而且近乎所有的例子页面均已失效),未经细剖便草草了事,感觉倒是适合作为厕所读物(汗).... 虽然书中不细剖,却也不能白花银子,不妨自己实打实地查资料.记笔记,不辜负了早上送出的老毛. P21 此处提到的例子动用了 -webkit-background-clip

System center 2012 R2 实战十、妙用SCO+SCOM实现声音告警

SCOM默认支持邮件告警,即时消息告警,短信告警,那么如果要实现声音告警,应该如何实现呢?大家可以好好思考一下,需求就是SCOM产生警报,同时触发声音告警+短信告警+邮件报警. 当时第一个想到的是Live Maps,Live Maps是一个单独的收费产品,通过Live Maps可以很好地与SCOM进行集成,还可以实现移动终端的声音告警,也可以做一套流程,比如说满足什么样子的条件,那些指定的服务器,去触发Sound声音插件,还可以实现地图展示,Live Maps有很多诱人的功能 产品地址如下 ht

as 的妙用

个人理解:as跟is is 相当于判断里的“==” 是与否 if(e.OriginalSource is Button) as 一般用来转换另一种object e.OriginalSource as Button 来获取相关属性或值 e.OriginalSource as RadioButton).Name.ToUpper() as和is的出现 一般是在路由事件中,需要通过这两个关键字来互交动态生成的不同类型或属性不同的UI控件 比如通过for生成按钮 for(int i = 0;i<10;i+

90%的卖家不知道,eBay销量爆涨有妙招!

说到提升销量,可能大部分卖家脑海里闪现的都是跟卖.优化.推广--,其实方法远远不止这些,今天小编讲讲不为人熟知的几种eBay销量爆涨妙招,希望对卖家们有所帮助. 1.UPC要好好利用 在eBay上,相同产品码的listing,是可以和Reviews共享客户的,而我们商家恰好可以利用这一点,借此找到那些Reviews数量多.质量好的listing,而如果它有产品码,而商家与该产品是同款,那我们也可以将产品码利用起来. UPC码正规渠道购买价格较高,如果是eBay用,商家可以去万能的某宝上购买,价格

转---深入浅出妙用 Javascript 中 apply、call、bind

作者:伯乐在线专栏作者 - chokcoco 如有好文章投稿,请点击 → 这里了解详情 如需转载,发送「转载」二字查看说明 这篇文章实在是很难下笔,因为网上相关文章不胜枚举. 巧合的是前些天看到阮老师的一篇文章的一句话: "对我来说,博客首先是一种知识管理工具,其次才是传播工具.我的技术文章,主要用来整理我还不懂的知识.我只写那些我还没有完全掌握的东西,那些我精通的东西,往往没有动力写.炫耀从来不是我的动机,好奇才是." 对于这句话,不能赞同更多,也让我下决心好好写这篇,网上文章虽多,

C++运算符重载的妙用

运算符重载(Operator overloading)是C++重要特性之中的一个,本文通过列举标准库中的运算符重载实例,展示运算符重载在C++里的妙用.详细包含重载operator<<,operator>>支持cin,cout输入输出.重载operator[],实现下标运算.重载operator+=实现元素追加:重载operator()实现函数调用.假设你对C++的运算符重载掌握的游刃有余.那就无需继续往下看了. 运算符重载带来的优点就是--让代码变得简洁.以下将展示几个标准库因使

深入浅出 妙用Javascript中apply、call、bind

apply.call.bind的认识,并且列出一些它们的妙用加深记忆. apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. JavaScript 的一大特点是,函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念. 先来一个栗子: 1 2 3 4 5 6 7 8 9 10 11 function fruits() {} fruit

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

1.单个颜色实现按钮 hover .active 的明暗变化 请点击 转载利用伪元素单个颜色实现 hover 和 active 时的明暗变化效果 2.利用after伪类清除浮动 .clearfix:after {content:"."; display:block; height:0; visibility:hidden; clear:both; } .clearfix { *zoom:1; } 3.增强用户体验,使用伪元素实现增大点击热区.适合用在点击区域较小的移动端,PC端看上去是