字典的快速赋值 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

正常输出!

字典的快速赋值 setValuesForKeysWithDictionary的更多相关文章

  1. 【iOS开发】字典的快速赋值 setValuesForKeysWithDictionary

    前言 在学习解析数据的时候,我们经常是这么写的:PersonModel.h文件中 @property (nonatomic,copy)NSString *name; @property (nonato ...

  2. jQuery对json快速赋值

    jQuery对json快速赋值,重点在于将input的id取跟JSON同样的名称. <!DOCTYPE html> <html> <head lang="en& ...

  3. 用字典给Model赋值并支持map键值替换

    用字典给Model赋值并支持map键值替换 这个是昨天教程的升级版本,支持键值的map替换. 源码如下: NSObject+Properties.h 与 NSObject+Properties.m / ...

  4. 用字典给Model赋值

    用字典给Model赋值 此篇教程讲述通过runtime扩展NSObject,可以直接用字典给Model赋值,这是相当有用的技术呢. 源码: NSObject+Properties.h 与 NSObje ...

  5. iOS开发之--字典快速赋值

    以往在学习解析数据的时候,我们用的方法都是一个一个生命,然后加到字典里面,然后进行复制,那样的麻烦,而且也不能保证一次成功,不出错,我是遇到过多次key值的问题! 其实可以把复制的过程替换成一句话: ...

  6. 总结day5 ---- ,字典的学习,增删改查,以及字典的嵌套, 赋值运算

    内容大纲: 一:字典的定义 二:字典的增加 >1:按照key增加,  无则增加,有则覆盖 >2:setdefault()  ,无则增加,有则不变 三:字典的删除 >1:pop()  ...

  7. TDictionary字典 记录 的赋值。

    type TRen = record age: Integer; //把name定义成结构的属性. private Fname: string; procedure Setname(const Val ...

  8. .NET通过字典给类赋值

    /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam& ...

  9. [python]字典的直接赋值、浅拷贝和深拷贝解析

    1.赋值引用 b = a: a 和 b 都指向同一个对象. 2.浅拷贝 b = a.copy():  a 和 b父对象是一个独立的对象,但他们的子对象还是指向统一对象(是引用). 3.深拷贝 b = ...

随机推荐

  1. ZLL主机接口的信息处理流程

    主机接口的信息处理流程 在我们翻译的文档中是用电脑端来模拟主机的,电脑代替网关发送主机接口命令的环节是在zll_controller.c中实现的,(在下载的文件中已经提供了其对应的可执行文件zllCm ...

  2. error C2039: “bind2nd”: 不是“std”的成员

    VS2012 出现如下错误: error C2039: "bind2nd": 不是"std"的成员     头文件中加上 #include <functi ...

  3. Http 请求处理流程

    引言 我查阅过不少Asp.Net的书籍,发现大多数作者都是站在一个比较高的层次上讲解Asp.Net.他们耐心.细致地告诉你如何一步步拖放控件.设置控件属性.编写CodeBehind代码,以实现某个特定 ...

  4. 【MyEcplise 插件】反编译插件jad

    jad是一个使用比较广泛的反编译插件. 这里说如何将jad安装到My Ecplise中. 1.下载jad的jar http://nchc.dl.sourceforge.net/project/jadc ...

  5. 安卓图表引擎AChartEngine(一) - 简介

    AChartEngine 是一个安卓系统上制作图表的框架,目前它支持如下的图表类型: line chart (折线图) area chart (面积图:分区图,对比图) scatter chart ( ...

  6. JAVA Day6

    1.对象:用来描述客观事物的一个实体,由一组属性和方法组成 2.属性--对象具有的各种特征    *每个对象的每个属性都拥有特定值    *例如:张浩和李明的年龄.姓名不一样 3.方法--对象执行的操 ...

  7. http://blog.csdn.net/hitmediaman/article/details/6636402

    http://blog.csdn.net/hitmediaman/article/details/6636402

  8. DFS Codeforces Round #290 (Div. 2) B. Fox And Two Dots

    题目传送门 /* DFS:每个点四处寻找,判断是否与前面的颜色相同,当走到已走过的表示成一个环 */ #include <cstdio> #include <iostream> ...

  9. C#生成PDF总结

    (一)C#生成PDF总结 (1)iTextSharp控件对iTextSharp研究还可以表格.文字.各种GDI对象,图片,水印,文字旋转(2)aspose的控件(3)PDF Library这个类库(只 ...

  10. thrift 学习

    入门教程: http://blog.zhengdong.me/2012/05/10/hello-world-by-thrift-using-java