KVC 中的 valueForKeyPath 高级用法

可能很多人对 - (nullable id)valueForKeyPath:(NSString *)keyPath; 这个方法不是很理解,实际上,这可以扩展到 KVC 中的高级用法上去。该方法非常强大。

NSArray *array1 = @[@"xiaoming", @"xiaohua", @"zhangshan", @"lisi"];
    NSLog(@"%@", [array1 valueForKeyPath:@"uppercaseString"]);

这里写图片描述

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

NSLog(@"%@", [array1 valueForKeyPath:@"length"]);

这里写图片描述

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

当然,还有许多其他高级功能,还是分别举例说明:

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

NSArray *array2 = @[@0, @2, @3, @4, @7];

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

NSLog(@"%@ %@ %@ %@",sum,avg,max,min);

可分别计算得到总和、平均值、最大值、最小值。

当然,也可以删除重复的数据

NSArray *array3 = @[@"qq", @"wechat", @"qq", @"msn", @"wechat"];
NSLog(@"%@", [array3 valueForKeyPath:@"@distinctUnionOfObjects.self"]);

这里写图片描述

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

NSArray *array4 = @[@{@"name" : @"xiaoming",
                      @"code" : @1},
                     @{@"name": @"judy",
                      @"code" : @2},
                     @{@"name": @"judy",
                      @"code" : @3},
                     @{@"name": @"xiaohua",
                      @"code" : @4}];
NSLog(@"%@", [array4 valueForKeyPath:@"name"]);

这里写图片描述

当然,也可以嵌套使用(先删除对应值的重复数据再取值):

NSArray *array5 = @[@{@"name" : @"xiaoming",
                      @"code" : @1},
                     @{@"name": @"judy",
                      @"code" : @2},
                     @{@"name": @"judy",
                      @"code" : @3},
                     @{@"name": @"xiaohua",
                      @"code" : @4}];
NSLog(@"%@", [array5 valueForKeyPath:@"@distinctUnionOfObjects.name"]);

这里写图片描述

还有更高级的用法:改变 UITextfield 的 placeholder 的颜色

[myTextField setValue:[UIColor whiteColor] forKeyPath:@”_placeholderLabel.textColor”];

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

更多高级用法,会在开发中慢慢得以体现。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值