无意中发现一个强大的方法,它可以节省我们很多的时间,减少代码量。非常的方便快捷
- (id)valueForKeyPath:(NSString *)keyPath
下面来介绍一下它的强大之处:
1、先来说我们可能常用的地方就是改变UITextField
的提示文字字体和字体的颜色:
// 改变提示文字的颜色
[textField setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];
// 改变提示文字体
[textField setValue:placeholderFont forKeyPath:@"_placeholderLabel.font"];
2、使用NSString
的属性等到相应的数组
// 小写变大写 大写字符串 字符串的属性方法
NSArray *array = @[@"name", @"wqw", @"aa"];
NSLog(@"%@", [array valueForKeyPath:@"uppercaseString"]);
// 每个字符串的长度组成的数组
NSLog(@"%@", [array valueForKeyPath:@"length"]);
3、对NSNumber
数组快速计算数组求和、平均数、最大值、最小值
NSArray *array1 = @[@12, @22, @30, @3, @10];
NSNumber *sum = [array1 valueForKeyPath:@"@sum.self"];
NSNumber *avg = [array1 valueForKeyPath:@"@avg.self"];
NSNumber *max = [array1 valueForKeyPath:@"@max.self"];
NSNumber *min = [array1 valueForKeyPath:@"@min.self"];
//下面的写法是指定输出类型
NSNumber *sum1 = [array1 valueForKeyPath:@"@sum.floatValue"];
NSNumber *avg1 = [array1 valueForKeyPath:@"@avg.floatValue"];
NSNumber *max1 = [array1 valueForKeyPath:@"@max.floatValue"];
NSNumber *min1 = [array1 valueForKeyPath:@"@min.floatValue"];
4、剔除数组里的重复数据
NSArray *array2 = @[@"name", @"wqw", @"aa", @"jeer", @"aa"];
NSLog(@"%@", [array2 valueForKeyPath:@"@distinctUnionOfObjects.self"]);
// 去除数组里面字典name对应值的重复数据
NSArray*gradeDic = @[@{@"name" : @"sddd", @"grade" : @98},
@{@"name" : @"sddd", @"grade" : @99},
@{@"name" : @"wed", @"grade" : @91}];
NSArray *nameDistinctArray = [gradeDic valueForKeyPath:@"@distinctUnionOfObjects.name"];
5、 先将数组中实体类中的一个属性提取成一个新数组
NSArray*gradeDic = @[@{@"name" : @"sdf", @"grade" : @98},
@{@"name" : @"sddd", @"grade" : @99},
@{@"name" : @"wed", @"grade" : @91}];
NSArray*gradeTotal=[gradeDic valueForKeyPath:@"@unionOfObjects.grade"];
6、找出字典数组里某个key对应的value组成数组
NSArray *array3 = @[@{@"name": @"sdfff",@"code": @8},
@{@"name": @"wer",@"code": @5},
@{@"name": @"wer",@"code": @3},
@{@"name": @"sdf",@"code": @2}];
NSLog(@"%@", [array3 valueForKeyPath:@"name"]);
//直接得到字典中namekey对应的值组成的数组,显然比循环取值再加入到新数组中方便快捷
7、 这个更厉害,当多个字典层级时,取子层级中的属性
NSDictionary *dict1 = @{@"dic1":@{@"dic2":@{@"name":@"liwe",@"info":@{@"age":@"45"}}}};
id res = [dict1 valueForKeyPath:@"dict1.dict2.name"];
网友评论