zoukankan      html  css  js  c++  java
  • 字典的快速赋值 setValuesForKeysWithDictionary

    字典的快速赋值 setValuesForKeysWithDictionary

    前言

    在学习解析数据的时候,我们经常是这么写的:
    PersonModel.h文件中

        @property (nonatomic,copy)NSString *name;    @property (nonatomic,copy)NSString *sex;    @property (nonatomic,copy)NSString *age;

    字典:

         NSDictionary *dic = @{@"name":@"张三",@"sex":@"男",@"age":@"22"};

    赋值:

         PersonModel *test=[[PersonModel alloc]init];
            test.name=dic[@"name"];
            test.sex=dic[@"sex"];
            test.age=dic[@"age"];

    输出:

            NSLog(@"test.name=%@",test.name);        NSLog(@"test.sex=%@",test.sex);        NSLog(@"test.age=%@",test.age);

    输出结果:

    2015-10-19 13:31:25.478
    setValuesForKeysWithDictionary[9676:913009] test.name=张三
    2015-10-19 13:31:25.478
    setValuesForKeysWithDictionary[9676:913009] test.sex=男
    2015-10-19 13:31:25.478
    setValuesForKeysWithDictionary[9676:913009] test.age=22

    看上去很有条理,按部就班,但是一旦数据多了起来,却会非常繁琐,所以这次我会介绍一个相对轻松的方法setValuesForKeysWithDictionary。


    简单使用

    如果用setValuesForKeysWithDictionary这个方法会怎样?
    将赋值过程

      test.name=dic[@"name"];
        test.sex=dic[@"sex"];
        test.age=dic[@"age"];

    替换为一句话

        [test setValuesForKeysWithDictionary:dic];

    输出结果一模一样,是不是简单又方便?


    深入的问题

    1. 如果model里面的有不存在于dic中的元素会怎样?

    在Model文件中添加一行

        @property (nonatomic,copy)NSString *other;

    并输出得时候输出

         NSLog(@"test.other=%@",test.other);

    输出结果:

    2015-10-19 13:49:25.955
    setValuesForKeysWithDictionary[9964:928391] test.name=张三
    2015-10-19 13:49:25.956
    setValuesForKeysWithDictionary[9964:928391] test.sex=男
    2015-10-19 13:49:25.956
    setValuesForKeysWithDictionary[9964:928391] test.age=22
    2015-10-19 13:49:25.956
    setValuesForKeysWithDictionary[9964:928391] test.other=(null)

    显而易见,dic中得值可以完全赋值给model,而other没有被赋值,所以值是空的。


    2.如果dic里面的有不存在于model中的元素会怎样?

    在Model文件中删除一行

        @property (nonatomic,copy) NSString* age;

    在删除对应得输出后运行。

    糟了!通过了编译,但是运行时报错!

    Terminating app due to uncaught exception 'NSUnknownKeyException',
    reason: '[<PersonModel 0x7fd731517910> setValue:forUndefinedKey:]:
    this class is not key value coding-compliant for the key age.'

    因为在model中,没有对应的age属性,所以导致了程序崩溃。

    解决方式就是实现一个方法setValue:forUndefinedKey: 这个方法能过滤掉不存在的键值。

    在model中添加。
    h文件中添加:

        -(void)setValue:(id)value forUndefinedKey:(NSString *)key;

    并需要在m文件中实现:

        -(void)setValue:(id)value forUndefinedKey:(NSString *)key{
    
        }

    对,并不需要在方法中写任何内容。
    现在来运行一下。
    输出结果:

    2015-10-19 13:55:55.390
    setValuesForKeysWithDictionary[10082:937173] test.name=张三
    2015-10-19 13:55:55.391
    setValuesForKeysWithDictionary[10082:937173] test.sex=男

    成功运行!


    3.如果dic中的key与model中的变量名字不同,应该怎么赋值?

    从前面我们可以知道,dic中key赋值给model中与key同名的属性。
    那么如果dic中得key值为 username,model中的名字为name,又或是dic中的key值为ID,INT 等关键字,应该怎么变化。
    答案也是从setValue:forUndefinedKey方法入手。

    首先我们把dic的值改变:

        NSDictionary *dic = @{@"username":@"张三",@"sex":@"男",@"id":@"22"};

    model中的属性:

        @property (nonatomic,copy)NSString *name;    @property (nonatomic,copy)NSString *sex;    @property (nonatomic,copy) NSString* age;

    完善model中的setValue:forUndefinedKey方法

        -(void)setValue:(id)value forUndefinedKey:(NSString *)key{        if([key isEqualToString:@"id"])
            {            self.age=value;
            }        if([key isEqualToString:@"username"])
            {            self.name=value;
            }
        }

    运行后结果:

        2015-10-19 14:30:11.241
        setValuesForKeysWithDictionary[10289:956012] test.name=张三    2015-10-19 14:30:11.242
        setValuesForKeysWithDictionary[10289:956012] test.sex=男    2015-10-19 14:30:11.242
        setValuesForKeysWithDictionary[10289:956012] test.age=22

    正常输出!

  • 相关阅读:
    C语言 realloc为什么要有返回值,realloc返回值具体解释/(解决随意长度字符串输入问题)。
    opencv中的vs框架中的Blob Tracking Tests的中文注释。
    Java实现 蓝桥杯VIP 算法提高 棋盘多项式
    Java实现 蓝桥杯VIP 算法提高 棋盘多项式
    Java实现 蓝桥杯VIP 算法提高 棋盘多项式
    Java实现 蓝桥杯VIP 算法提高 棋盘多项式
    Java实现 蓝桥杯VIP 算法提高 分苹果
    Java实现 蓝桥杯VIP 算法提高 分苹果
    Java实现 蓝桥杯VIP 算法提高 分苹果
    Java实现 蓝桥杯VIP 算法提高 分苹果
  • 原文地址:https://www.cnblogs.com/LiLihongqiang/p/5524222.html
Copyright © 2011-2022 走看看