您的位置:首页 > 产品设计 > UI/UE

KVC 中的 valueForKeyPath 高级用法

2017-07-09 15:32 543 查看
可能很多人对
- (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;
要方便太多!

更多高级用法,会在开发中慢慢得以体现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: