valueForKeyPath的妙用(转)

可能大家对 - (id)valueForKeyPath:(NSString *)keyPath 方法不是很了解。

其实这个方法非常的强大,举个例子:

NSArray *array = @[@"name", @"w", @"aa", @"jimsa"];
NSLog(@"%@", [array valueForKeyPath:@"uppercaseString"]);

输出
(
    NAME,
    W,
    AA,
    JIMSA
)

相当于数组中的每个成员执行了uppercaseString方法,然后把返回的对象组成一个新数组返回。

既然可以用uppercaseString方法,那么NSString的其他方法也可以,比如

[array valueForKeyPath:@"length"]

返回每个字符串长度的组成的数组。只要你能想到的成员实例方法都可以这么用。

如果你觉得这个方法就这么点功能,那就错了。还是举具体的例子,继续往下看

对NSNumber数组快速计算数组求和、平均数、最大值、最小值

    NSArray *array = @[@1, @2, @3, @4, @10];

    NSNumber *sum = [array valueForKeyPath:@"@sum.self"];
    NSNumber *avg = [array valueForKeyPath:@"@avg.self"];
    NSNumber *max = [array valueForKeyPath:@"@max.self"];
    NSNumber *min = [array valueForKeyPath:@"@min.self"];

或者指定输出类型

1     NSNumber *sum = [array valueForKeyPath:@"@sum.floatValue"];
2     NSNumber *avg = [array valueForKeyPath:@"@avg.floatValue"];
3     NSNumber *max = [array valueForKeyPath:@"@max.floatValue"];
4     NSNumber *min = [array valueForKeyPath:@"@min.floatValue"];

剔除重复数据

1     NSArray *array = @[@"name", @"w", @"aa", @"jimsa", @"aa"];
2     NSLog(@"%@", [array valueForKeyPath:@"@distinctUnionOfObjects.self"]);

1 打印
2
3 (
4 name,
5 w,
6 jimsa,
7 aa
8 )

NSDictionary数组快速找出相应key对的值

1 NSArray *array = @[@{@"name" : @"cookeee",@"code" : @1},
2                            @{@"name": @"jim",@"code" : @2},
3                            @{@"name": @"jim",@"code" : @1},
4                            @{@"name": @"jbos",@"code" : @1}];
5 NSLog(@"%@", [array valueForKeyPath:@"name"]);

直接得到字典中namekey对应的值组成的数组,显然比循环取值再加入到新数组中方便快捷

1 (
2     cookeee,
3     jim,
4     jim,
5     jbos
6 )

同样可以嵌套使用,先剔除name对应值的重复数据再取值

 1  NSArray *array = @[@{@"name" : @"cookeee",@"code" : @1},
 2                            @{@"name": @"jim",@"code" : @2},
 3                            @{@"name": @"jim",@"code" : @1},
 4                            @{@"name": @"jbos",@"code" : @1}];
 5
 6     NSLog(@"%@", [array valueForKeyPath:@"@distinctUnionOfObjects.name"]);
 7
 8 打印
 9 (
10 cookeee,
11 jim,
12 jbos
13 )

改变UITextfiedl的placeholder的颜色

1     [searchField setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];

比起重写- (void)drawPlaceholderInRect:(CGRect)rect;要方便很多

转至:http://segmentfault.com/a/1190000000526660

时间: 2024-10-23 14:35:28

valueForKeyPath的妙用(转)的相关文章

妙用valueForKeyPath

valueForKey与valueForKeyPath在KVC中同时出现,都可以使用,难免让开发者迷惑:心里知道肯定是不一样,但具体的用法你会吗?其实valueForKeyPath的功能更强大,支持深层次结构的调用和特殊用法,下面展示其在对象操作符中的使用. 对象操作符有三类: 聚合操作符(Aggregation Operators): 依据对集合里的每一个对象的同一属性的指定操作,返回该属性被操作后的值 数组操作符(Array Operators): 依据某一条件取出每一个对象的同一属性,组成

《众妙之门——精通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端看上去是