iOS 知识大全

iOS --- valueForKeyPath 高效的方法

2018-03-20  本文已影响14人  31313_iOS

无意中发现一个强大的方法,它可以节省我们很多的时间,减少代码量。非常的方便快捷
- (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"];
上一篇 下一篇

猜你喜欢

热点阅读