美文网首页iOS 知识大全
iOS --- valueForKeyPath 高效的方法

iOS --- valueForKeyPath 高效的方法

作者: 31313_iOS | 来源:发表于2018-03-20 19:48 被阅读14次

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

    相关文章

      网友评论

        本文标题:iOS --- valueForKeyPath 高效的方法

        本文链接:https://www.haomeiwen.com/subject/ydtzyxtx.html