valueForkeyPath方法使用

转载 2015年11月17日 21:35:32

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

<code style="font-family: Consolas, Menlo, Monaco, 'Courier New', monospace; font-size: 1em; padding: 0px; color: inherit; white-space: inherit; background-color: transparent;"><span class="hljs-built_in" style="color: rgb(38, 139, 210);">NSArray</span> *array = @[<span class="hljs-string" style="color: rgb(42, 161, 152);">@"name"</span>, <span class="hljs-string" style="color: rgb(42, 161, 152);">@"w"</span>, <span class="hljs-string" style="color: rgb(42, 161, 152);">@"aa"</span>, <span class="hljs-string" style="color: rgb(42, 161, 152);">@"jimsa"</span>];
<span class="hljs-built_in" style="color: rgb(38, 139, 210);">NSLog</span>(<span class="hljs-string" style="color: rgb(42, 161, 152);">@"%@"</span>, [array valueForKeyPath:<span class="hljs-string" style="color: rgb(42, 161, 152);">@"uppercaseString"</span>]);
</code>

输出

<code style="font-family: Consolas, Menlo, Monaco, 'Courier New', monospace; font-size: 1em; padding: 0px; color: inherit; white-space: inherit; background-color: transparent;">(
    NAME,
    W,
    AA,
    JIMSA
)
</code>

相当于数组中的每个成员执行了uppercaseString方法,然后把返回的对象组成一个新数组返回。既然可以用uppercaseString方法,那么NSString的其他方法也可以,比如

<code style="font-family: Consolas, Menlo, Monaco, 'Courier New', monospace; font-size: 1em; padding: 0px; color: inherit; white-space: inherit; background-color: transparent;">[array valueForKeyPath:@<span class="hljs-string" style="color: rgb(42, 161, 152);">"length"</span>]
</code>

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


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

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

<code style="font-family: Consolas, Menlo, Monaco, 'Courier New', monospace; font-size: 1em; padding: 0px; color: inherit; white-space: inherit; background-color: transparent;">    <span class="hljs-title" style="color: rgb(133, 153, 0);">NSArray</span> *array = @[@<span class="hljs-number" style="color: rgb(42, 161, 152);">1</span>, @<span class="hljs-number" style="color: rgb(42, 161, 152);">2</span>, @<span class="hljs-number" style="color: rgb(42, 161, 152);">3</span>, @<span class="hljs-number" style="color: rgb(42, 161, 152);">4</span>, @<span class="hljs-number" style="color: rgb(42, 161, 152);">10</span>];

    <span class="hljs-title" style="color: rgb(133, 153, 0);">NSNumber</span> *sum = [array valueForKeyPath:@<span class="hljs-string" style="color: rgb(42, 161, 152);">"<span class="hljs-variable" style="color: rgb(181, 137, 0);">@sum</span>.self"</span>];
    <span class="hljs-title" style="color: rgb(133, 153, 0);">NSNumber</span> *avg = [array valueForKeyPath:@<span class="hljs-string" style="color: rgb(42, 161, 152);">"<span class="hljs-variable" style="color: rgb(181, 137, 0);">@avg</span>.self"</span>];
    <span class="hljs-title" style="color: rgb(133, 153, 0);">NSNumber</span> *max = [array valueForKeyPath:@<span class="hljs-string" style="color: rgb(42, 161, 152);">"<span class="hljs-variable" style="color: rgb(181, 137, 0);">@max</span>.self"</span>];
    <span class="hljs-title" style="color: rgb(133, 153, 0);">NSNumber</span> *min = [array valueForKeyPath:@<span class="hljs-string" style="color: rgb(42, 161, 152);">"<span class="hljs-variable" style="color: rgb(181, 137, 0);">@min</span>.self"</span>];
</code>

或者指定输出类型

<code style="font-family: Consolas, Menlo, Monaco, 'Courier New', monospace; font-size: 1em; padding: 0px; color: inherit; white-space: inherit; background-color: transparent;">    <span class="hljs-title" style="color: rgb(133, 153, 0);">NSNumber</span> *sum = [array valueForKeyPath:@<span class="hljs-string" style="color: rgb(42, 161, 152);">"<span class="hljs-variable" style="color: rgb(181, 137, 0);">@sum</span>.floatValue"</span>];
    <span class="hljs-title" style="color: rgb(133, 153, 0);">NSNumber</span> *avg = [array valueForKeyPath:@<span class="hljs-string" style="color: rgb(42, 161, 152);">"<span class="hljs-variable" style="color: rgb(181, 137, 0);">@avg</span>.floatValue"</span>];
    <span class="hljs-title" style="color: rgb(133, 153, 0);">NSNumber</span> *max = [array valueForKeyPath:@<span class="hljs-string" style="color: rgb(42, 161, 152);">"<span class="hljs-variable" style="color: rgb(181, 137, 0);">@max</span>.floatValue"</span>];
    <span class="hljs-title" style="color: rgb(133, 153, 0);">NSNumber</span> *min = [array valueForKeyPath:@<span class="hljs-string" style="color: rgb(42, 161, 152);">"<span class="hljs-variable" style="color: rgb(181, 137, 0);">@min</span>.floatValue"</span>];
</code>

剔除重复数据

<code style="font-family: Consolas, Menlo, Monaco, 'Courier New', monospace; font-size: 1em; padding: 0px; color: inherit; white-space: inherit; background-color: transparent;">    <span class="hljs-built_in" style="color: rgb(38, 139, 210);">NSArray</span> *array = @[<span class="hljs-string" style="color: rgb(42, 161, 152);">@"name"</span>, <span class="hljs-string" style="color: rgb(42, 161, 152);">@"w"</span>, <span class="hljs-string" style="color: rgb(42, 161, 152);">@"aa"</span>, <span class="hljs-string" style="color: rgb(42, 161, 152);">@"jimsa"</span>, <span class="hljs-string" style="color: rgb(42, 161, 152);">@"aa"</span>];
    <span class="hljs-built_in" style="color: rgb(38, 139, 210);">NSLog</span>(<span class="hljs-string" style="color: rgb(42, 161, 152);">@"%@"</span>, [array valueForKeyPath:<span class="hljs-string" style="color: rgb(42, 161, 152);">@"@distinctUnionOfObjects.self"</span>]);
</code>

打印

(
name,
w,
jimsa,
aa
)

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

<code style="font-family: Consolas, Menlo, Monaco, 'Courier New', monospace; font-size: 1em; padding: 0px; color: inherit; white-space: inherit; background-color: transparent;"><span class="hljs-constant" style="color: rgb(181, 137, 0);">NSArray</span> *array = @[@{@<span class="hljs-string" style="color: rgb(42, 161, 152);">"name"</span> <span class="hljs-symbol" style="color: rgb(203, 75, 22);">:</span> @<span class="hljs-string" style="color: rgb(42, 161, 152);">"cookeee"</span>,@<span class="hljs-string" style="color: rgb(42, 161, 152);">"code"</span> <span class="hljs-symbol" style="color: rgb(203, 75, 22);">:</span> <span class="hljs-variable" style="color: rgb(181, 137, 0);">@1</span>},
                           @{@<span class="hljs-string" style="color: rgb(42, 161, 152);">"name"</span><span class="hljs-symbol" style="color: rgb(203, 75, 22);">:</span> @<span class="hljs-string" style="color: rgb(42, 161, 152);">"jim"</span>,@<span class="hljs-string" style="color: rgb(42, 161, 152);">"code"</span> <span class="hljs-symbol" style="color: rgb(203, 75, 22);">:</span> <span class="hljs-variable" style="color: rgb(181, 137, 0);">@2</span>},
                           @{@<span class="hljs-string" style="color: rgb(42, 161, 152);">"name"</span><span class="hljs-symbol" style="color: rgb(203, 75, 22);">:</span> @<span class="hljs-string" style="color: rgb(42, 161, 152);">"jim"</span>,@<span class="hljs-string" style="color: rgb(42, 161, 152);">"code"</span> <span class="hljs-symbol" style="color: rgb(203, 75, 22);">:</span> <span class="hljs-variable" style="color: rgb(181, 137, 0);">@1</span>},
                           @{@<span class="hljs-string" style="color: rgb(42, 161, 152);">"name"</span><span class="hljs-symbol" style="color: rgb(203, 75, 22);">:</span> @<span class="hljs-string" style="color: rgb(42, 161, 152);">"jbos"</span>,@<span class="hljs-string" style="color: rgb(42, 161, 152);">"code"</span> <span class="hljs-symbol" style="color: rgb(203, 75, 22);">:</span> <span class="hljs-variable" style="color: rgb(181, 137, 0);">@1</span>}];
<span class="hljs-constant" style="color: rgb(181, 137, 0);">NSLog</span>(@<span class="hljs-string" style="color: rgb(42, 161, 152);">"%@"</span>, [array <span class="hljs-symbol" style="color: rgb(203, 75, 22);">valueForKeyPath:</span>@<span class="hljs-string" style="color: rgb(42, 161, 152);">"name"</span>]);
</code>

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

<code style="font-family: Consolas, Menlo, Monaco, 'Courier New', monospace; font-size: 1em; padding: 0px; color: inherit; white-space: inherit; background-color: transparent;">(
    cookeee,
    jim,
    jim,
    jbos
)
</code>

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

<code style="font-family: Consolas, Menlo, Monaco, 'Courier New', monospace; font-size: 1em; padding: 0px; color: inherit; white-space: inherit; background-color: transparent;"> <span class="hljs-constant" style="color: rgb(181, 137, 0);">NSArray</span> *array = @[@{@<span class="hljs-string" style="color: rgb(42, 161, 152);">"name"</span> <span class="hljs-symbol" style="color: rgb(203, 75, 22);">:</span> @<span class="hljs-string" style="color: rgb(42, 161, 152);">"cookeee"</span>,@<span class="hljs-string" style="color: rgb(42, 161, 152);">"code"</span> <span class="hljs-symbol" style="color: rgb(203, 75, 22);">:</span> <span class="hljs-variable" style="color: rgb(181, 137, 0);">@1</span>},
                           @{@<span class="hljs-string" style="color: rgb(42, 161, 152);">"name"</span><span class="hljs-symbol" style="color: rgb(203, 75, 22);">:</span> @<span class="hljs-string" style="color: rgb(42, 161, 152);">"jim"</span>,@<span class="hljs-string" style="color: rgb(42, 161, 152);">"code"</span> <span class="hljs-symbol" style="color: rgb(203, 75, 22);">:</span> <span class="hljs-variable" style="color: rgb(181, 137, 0);">@2</span>},
                           @{@<span class="hljs-string" style="color: rgb(42, 161, 152);">"name"</span><span class="hljs-symbol" style="color: rgb(203, 75, 22);">:</span> @<span class="hljs-string" style="color: rgb(42, 161, 152);">"jim"</span>,@<span class="hljs-string" style="color: rgb(42, 161, 152);">"code"</span> <span class="hljs-symbol" style="color: rgb(203, 75, 22);">:</span> <span class="hljs-variable" style="color: rgb(181, 137, 0);">@1</span>},
                           @{@<span class="hljs-string" style="color: rgb(42, 161, 152);">"name"</span><span class="hljs-symbol" style="color: rgb(203, 75, 22);">:</span> @<span class="hljs-string" style="color: rgb(42, 161, 152);">"jbos"</span>,@<span class="hljs-string" style="color: rgb(42, 161, 152);">"code"</span> <span class="hljs-symbol" style="color: rgb(203, 75, 22);">:</span> <span class="hljs-variable" style="color: rgb(181, 137, 0);">@1</span>}];

    <span class="hljs-constant" style="color: rgb(181, 137, 0);">NSLog</span>(@<span class="hljs-string" style="color: rgb(42, 161, 152);">"%@"</span>, [array <span class="hljs-symbol" style="color: rgb(203, 75, 22);">valueForKeyPath:</span>@<span class="hljs-string" style="color: rgb(42, 161, 152);">"@distinctUnionOfObjects.name"</span>]);
</code>

打印
(
cookeee,
jim,
jbos
)

改变UITextfiedl的placeholder的颜色

<code style="font-family: Consolas, Menlo, Monaco, 'Courier New', monospace; font-size: 1em; padding: 0px; color: inherit; white-space: inherit; background-color: transparent;">    [searchField <span class="hljs-built_in" style="color: rgb(38, 139, 210);">set</span>Value:[UIColor whiteColor] <span class="hljs-keyword" style="color: rgb(133, 153, 0);">for</span>KeyPath:@<span class="hljs-string" style="color: rgb(42, 161, 152);">"_placeholderLabel.textColor"</span>];
</code>

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

相关文章推荐

ESAPI使用方法

  • 2017年11月16日 10:42
  • 423KB
  • 下载

g++中的-march与-mtune的意义与使用方法

Next: i386 and x86-64 Windows Options, Previous: HPPA Options, Up: Submodel Options 3....

SST89E516仿真芯片使用方法

  • 2017年11月21日 12:21
  • 1012KB
  • 下载

jacob.jar的使用方法

  • 2017年11月15日 15:22
  • 178KB
  • 下载

FFT的C语言库FFTW的Windows和linux安装使用方法

机子里的FFTW库下了很长时间了,总也没有去搞。唉,有很多东西就是这样,千方百计搞过来,搞到手了就晾在那里了。记得《黄生借书说》里面说得对啊“书非借不能读也”。 好了,感慨完毕。归入正题。 Win...

微信语音导出工具及使用方法

  • 2017年11月21日 17:07
  • 44.56MB
  • 下载

基本的arcgis api使用方法

  • 2017年11月13日 10:08
  • 25KB
  • 下载

java中set和get方法的理解使用

java中set和get方法的理解使用 Java为什么会引入set/get方法??         显然回答这个问题,我们需要了解封装         封装是保证软件部件具有优良的模块性的基础,...
  • wjtyy
  • wjtyy
  • 2015年05月22日 20:11
  • 7465
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:valueForkeyPath方法使用
举报原因:
原因补充:

(最多只允许输入30个字)