美文网首页
valueForKeyPath详解

valueForKeyPath详解

作者: 蚂蚁揍蜗牛 | 来源:发表于2018-08-13 16:36 被阅读0次

    1.objectForKey/valueForKey/valueForKeyPath区分

    1.1. objectForKey是字典的方法,用来通过key取得字典的值.只有字典可以调用这个方法
    1.2. valueForKey和valueForKeyPath是两个KVC方法,所有的对象都可以调用, 
         valueForKey可以通过属性名获取到这个属性的值,而valueForKeyPath则可以实现多级取值.
    

    2.用处一

    2.1. 对于@[@{key:value},@{key:value},@{key:value}]的数组(数组元素是字典的),
    通过同一个key可以取到value的集合(数组)
    例:
        NSDictionary *dic1 = @{@"city":@"北京",@"count":@"22"};
        NSDictionary *dic2 = @{@"city":@"上海",@"count":@"18"};
        NSDictionary *dic3 = @{@"city":@"深圳",@"count":@"17"};
        NSArray *arr = @[dic1,dic2,dic3];
    输出结果:
      city:(
        "北京",
        "上海",
        "深圳"
      )
      count:(
        22,
        18,
        17
      )
    

    3.用处二

    3.1. 可以计算平均值/求和等操作(简单集合运算符分别为:@avg,@count,@max,@min,@sum)
    例如:求 例2.1 中数组的算术操作(数组是对象的话,需要使用' @sum.count ',count为求值字段 )
        NSLog(@"求和:%@",[arr valueForKeyPath:@"@sum.count"]);
        NSLog(@"平均:%@",[arr valueForKeyPath:@"@avg.count"]);
        NSLog(@"最大:%@",[arr valueForKeyPath:@"@max.count"]);
        NSLog(@"最小:%@",[arr valueForKeyPath:@"@min.count"]);
    输出结果:
    [15:29:27] -[LoginViewController Test] [第83行] 求和:57
    [15:29:27] -[LoginViewController Test] [第84行] 平均:19
    [15:29:27] -[LoginViewController Test] [第85行] 最大:22
    [15:29:27] -[LoginViewController Test] [第86行] 最小:17
    
    例如:数组是非对象,可以如下求值,floatValue为求值的类型
        NSMutableArray *array = [NSMutableArray arrayWithObjects:@9,@"12",@15,@20,@"30", nil];
        CGFloat maxValue = [[array valueForKeyPath:@"@max.floatValue"] floatValue];
        CGFloat minValue = [[array valueForKeyPath:@"@min.floatValue"] floatValue];
    输出结果:
    [16:22:55] -[LoginViewController Test] [第122行] 最大值=== 30.000000 
    [16:22:55] -[LoginViewController Test] [第122行] 最小值 === 9.000000
    
    再或者如下:使用self求值默认为double类型数据
        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"];
    

    4.用处三

    4.1. 对于@{key1:@{key2:vale}}的字典(字典的value是另一个字典),
         通过key1.key2的链式的方式得到最深层的字典的值
    例如:
        NSDictionary *dict4 = @{@"name":@"小明",@"age":@"22"};
        NSDictionary *dict5 = @{@"student":dict4};
        NSDictionary *dict6 = @{@"class":dict5};
        NSDictionary *dict7 = @{@"school":dict6};
        NSLog(@"%@",[dict7 valueForKeyPath:@"school.class.student.name"]);
        NSLog(@"%@",[dict7 valueForKeyPath:@"school.class.student.age"]);
    输出结果:
    [15:32:33] -[LoginViewController Test] [第93行] 小明
    [15:32:33] -[LoginViewController Test] [第94行] 22
    

    5.用处四

    5.1. 不只是字典套字典,对象套对象/对象套对象再套字典等情况,都可以通过链式调用到深层的值
    例如:
    Student *student1 = [[Student alloc] init];
        student1.name = @"小红";
        student1.info = @{@"phone":@"13102212345",@"mail":@"xiaohong@qq.com"};
        School *school = [[School alloc] init];
        school.student = student1;
        NSLog(@"%@",[school valueForKeyPath:@"student.name"]);
        NSLog(@"%@",[school valueForKeyPath:@"student.info.phone"]);
    输出结果:
    2016-08-03 15:21:38.258 ValueForKeyPath使用[5261:202278] 小红
    2016-08-03 15:21:38.258 ValueForKeyPath使用[5261:202278] 13102212345
    2016-08-03 15:21:38.259 ValueForKeyPath使用[5261:202278] xiaohong@qq.com
    

    6.用处五

    6.1. 可以快速删除数组重复数据
    例如:如果数组是非对象对局,使用的keypath为 ' @distinctUnionOfObjects.self '
    NSArray *array3 = @[@"qq", @"wechat", @"qq", @"msn", @"wechat"];
    NSLog(@"%@", [array3 valueForKeyPath:@"@distinctUnionOfObjects.self"]);
    输出结果:
    [15:36:55] -[LoginViewController Test] [第97行] (
        qq,
        wechat,
        msn
    )
    例如:数组是对象的数据,使用的keypath为 ' @distinctUnionOfObjects.keys ',keys为去重的键值
    NSArray *array = @[ @{@"title":@"zxp",@"name":@"zhangxiaoping"}, 
    @{@"title":@"zxp2",@"name":@"zhangxiaoping2"}, 
    @{@"title":@"zxp",@"name":@"zhangxiaoping3"}, @{@"title":@"zxp",@"name":@"zhangxiaoping"}];
    //根据name字段,来进行重复删除。
    NSArray *newArray = [array valueForKeyPath:@"@distinctUnionOfObjects.name"];
    //如果要根据title字段来删除重名的写法为`@distinctUnionOfObjects.title` 
    NSLog(@"%@", newArray);
    输出结果:
    [15:42:37] -[LoginViewController Test] [第105行] (
        zhangxiaoping3,
        zhangxiaoping2,
        zhangxiaoping
    )
    
    

    7.用处六

    7.1. 可以进行示例方法的调用
    NSArray *array = @[@"name", @"w", @"aa", @"ZXPing"]; 
    NSLog(@"%@", [array valueForKeyPath:@"uppercaseString"]);
    输出结果:
    (
        NAME,
        W,
        AA,
        ZXPING
    )
    相当于数组中的每个成员执行了uppercaseString方法,然后把返回的对象组成一个新数组返回。
    既然可以用uppercaseString方法,那么NSString的其他方法也可以,
    比如[array valueForKeyPath:@"length"]。当然,其他对象的实例方法也可以以此类推来进行调用~!
    

    相关文章

      网友评论

          本文标题:valueForKeyPath详解

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