前言

在学习解析数据的时候,我们经常是这么写的:
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

正常输出!

文/嘻嘻zhy(简书作者)
原文链接:http://www.jianshu.com/p/870eb4b4170a
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

【iOS开发】字典的快速赋值 setValuesForKeysWithDictionary的更多相关文章

  1. 字典的快速赋值 setValuesForKeysWithDictionary

    字典的快速赋值 setValuesForKeysWithDictionary ​ 前言 在学习解析数据的时候,我们经常是这么写的:PersonModel.h文件中    @property (nona ...

  2. iOS开发--字典(NSDictionary)和JSON字符串(NSString)之间互转

    iOS开发--字典(NSDictionary)和JSON字符串(NSString)之间互转 1. 字典转Json字符串 // 字典转json字符串方法 -(NSString *)convertToJs ...

  3. iOS开发—字典转模型,KVC设计模式

    iOS开发UI基础—字典转模型 开发中,通常使用第三方框架可以很快的实现通过字典转模型,通过plist创建模型,将字典的键值对转成模型属性,将模型转成字典,通过模型数组来创建一个字典数组,通过字典数组 ...

  4. iOS开发——多线程篇——快速生成沙盒目录的路径,多图片下载的原理、SDWebImage框架的简单介绍

    一.快速生成沙盒目录的路径 沙盒目录的各个文件夹功能 - Documents - 需要保存由"应用程序本身"产生的文件或者数据,例如:游戏进度.涂鸦软件的绘图 - 目录中的文件会被 ...

  5. iOS开发- 三步快速集成社交化分享工具ShareSDK

    1.前言 作为现在App里必不可少的用户分享需要,社交化分享显然是我们开发app里较为常用的. 最近因为公司App有社交化分享的需要,就特此研究了会,拿出来与大家分享. 想要集成社交会分享,我们可以使 ...

  6. iOS开发——项目需求-快速回到当前界面的顶部

    利用UIWindow实现快速到达顶部 如下图,在状态栏添加一个没有颜色的UIWindow(里面添加一个按钮),实现点击这个按钮时能快速的回到当前界面的顶部 核心代码 一.利用UIWindow实现到达顶 ...

  7. iOS开发——实用篇&KVO与KVC详解

    KVO与KVC详解 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC ...

  8. iOS开发之使用Runtime给Model类赋值

    本篇博客算是给网络缓存打个基础吧,本篇博客先给出简单也是最容易使用的把字典转成实体类的方法,然后在给出如何使用Runtime来给Model实体类赋值.本篇博客会介绍一部分,主要是字典的key与Mode ...

  9. ios开发- 利用运行时(runtime)字典转模型

    现在的ios开发中,我们通常会使用MVC模式.当我们拿到数据的时候,我们要把数据转成模型使用. 一般情况我们拿到的数据都是字典.这是我们就需要将字典转成模型对象了. 当对象的属性很少的时候,我们可以直 ...

随机推荐

  1. Spring框架中的IOC?

    Spring中的org.springframework.beans包和org.SpringframeWork.context包构成了Spring框架IOC容器的基础.BeanFactory接口提供了一 ...

  2. python中and,or

    在很多逻辑语句中,常常会出现and,or这两个逻辑运算符. 下面直接上代码 print(0 or None) #None ''' or比较运算符: 当or旁两边都是真的话,那么会取第一个值 当or两边 ...

  3. C++新闻检索类

    研究长字符串快速全文检索技术,实现某电力公司新闻中心新闻稿件全文检索统计系统. 1. 设计实现适合新闻稿件的基础类库 2. 新闻稿件全文检索功能实现 3. 新闻稿件按照关键字统计查询   代码如下 P ...

  4. 小胖办证 wzoi

    小胖办证 题目描述: xuzhenyi要办个签证.办证处是一座M层的大楼,1<=M<=100. 每层楼都有N个办公室,编号为1..N(1<=N<=500).每个办公室有一个签证 ...

  5. JS数组push一个对象

    这个是正确的数据添加对象 var dypieArr = []; var dyArr = []; var arrStr = ''; for(var i = 0; i < dataStreet.le ...

  6. php xml转数组 自定义xml_to_array

    <?php header("Content-type: text/xml; charset=utf-8"); $con = file_get_contents('xml路径' ...

  7. ecshop 漏洞如何修复 补丁升级与安全修复详情

    目前ecshop漏洞大面积爆发,包括最新版的ecshop 3.0,ecshop 4.0,ecshop2.7.3全系列版本都存在着高危网站漏洞,导致网站被黑,被篡改,被挂马,许多商城系统深受其漏洞的攻击 ...

  8. 人人都会设计模式:观察者模式--Observer

    https://segmentfault.com/a/1190000012295887 观察者模式是抽像通知者和观察者,达到具体通知者跟具体观察者没有偶合.能达到不管是切换通知者,或者是切换观察者,都 ...

  9. 006---hashlib模块

    hashlib模块 HASH 一般翻译成散列,也可以叫哈希. 把任意长度的输入通过散列算法变换成固定的长度. 该转换是一种压缩映射 MD5 输入任意长度的信息,经过处理.输出为128位的信息(数字指纹 ...

  10. 002---Python基本数据类型--字符串

    字符串 .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1p ...