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;要方便很多

KVC 中的 valueForKeyPath 高级用法

可能很多人对 - (nullable id)valueForKeyPath:(NSString *)keyPath; 这个方法不是很理解,实际上,这可以扩展到 KVC 中的高级用法上去。该方法非常强大...
  • huangfei711
  • huangfei711
  • 2017年07月09日 15:32
  • 1455

- (id)valueForKeyPath:(NSString *)keyPath 用法总结

可能大家对- (id)valueForKeyPath:(NSString *)keyPath方法不是很了解。 其实这个方法非常的强大,举个例子: NSArray *array = @[@"nam...
  • u013397636
  • u013397636
  • 2016年01月13日 23:07
  • 521

WKWebView和UIWebView及其四种交互

** UIWebView 官方文档翻译 ** 继承关系:NSObject→UIResponder→UIView-→UIWebView 遵循:NSCoding NSObject UIApp...
  • shangy110
  • shangy110
  • 2016年01月17日 15:09
  • 5015

valueForKeyPath 方法的使用

可能大家对- (id)valueForKeyPath:(NSString *)keyPath方法不是很了解。 其实这个方法非常的强大,举个例子: NSArray *array = @[@"name...
  • jiyug108
  • jiyug108
  • 2015年06月27日 16:34
  • 151

valueForKey与valueForKeyPath

开发过程中,免不了的是经常和接口打交道,那么对于json子串解析,以及字典与数组的取值我们已经熟悉的不能再熟悉,那么对于valueForKey与valueForKeyPath的使用区别可能不是很了解....
  • shiios
  • shiios
  • 2016年12月20日 12:09
  • 563

valueForKeyPath的使用

1 NSArray *testArray = [NSArray arrayWithObjects:@"2.0", @"2.3", @"3.0", @"4.0", nil]; ...
  • binyanye1
  • binyanye1
  • 2015年02月02日 20:08
  • 5531

valueForKeyPath

可能大家对- (id)valueForKeyPath:(NSString *)keyPath方法不是很了解。 其实这个方法非常的强大,举个例子: NSArray *array = @[@"name...
  • xiaotou1991
  • xiaotou1991
  • 2015年03月31日 10:10
  • 248

iOS 数组使用 valueForKeyPath:计算求和、平均值、最大、最小

NSArray *testArray = [NSArray arrayWithObjects:@"2.0", @"2.3", @"3.0", @"4.0", nil]; 2 3 NSNumber ...
  • u012847940
  • u012847940
  • 2016年05月16日 16:03
  • 1888

iPhont X适配

iphontX若不设置启动图片相当于iPhone8的放大模式(375*667) ,若设置了启动图片才是他的实际像素,实际像素点: 5.8英寸屏(1125*2436) 768*1024 矢量...
  • jia12216
  • jia12216
  • 2017年11月30日 21:34
  • 160

valueForKeyPath的使用小结

1 NSArray *testArray = [NSArray arrayWithObjects:@"2.0", @"2.3", @"3.0", @"4.0", nil]; ...
  • chowpan
  • chowpan
  • 2013年07月08日 17:05
  • 7866
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:valueForkeyPath方法使用
举报原因:
原因补充:

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