字典的快速赋值 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];
输出结果一模一样,是不是简单又方便?
深入的问题
- 如果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的更多相关文章
- 【iOS开发】字典的快速赋值 setValuesForKeysWithDictionary
前言 在学习解析数据的时候,我们经常是这么写的:PersonModel.h文件中 @property (nonatomic,copy)NSString *name; @property (nonato ...
- jQuery对json快速赋值
jQuery对json快速赋值,重点在于将input的id取跟JSON同样的名称. <!DOCTYPE html> <html> <head lang="en& ...
- 用字典给Model赋值并支持map键值替换
用字典给Model赋值并支持map键值替换 这个是昨天教程的升级版本,支持键值的map替换. 源码如下: NSObject+Properties.h 与 NSObject+Properties.m / ...
- 用字典给Model赋值
用字典给Model赋值 此篇教程讲述通过runtime扩展NSObject,可以直接用字典给Model赋值,这是相当有用的技术呢. 源码: NSObject+Properties.h 与 NSObje ...
- iOS开发之--字典快速赋值
以往在学习解析数据的时候,我们用的方法都是一个一个生命,然后加到字典里面,然后进行复制,那样的麻烦,而且也不能保证一次成功,不出错,我是遇到过多次key值的问题! 其实可以把复制的过程替换成一句话: ...
- 总结day5 ---- ,字典的学习,增删改查,以及字典的嵌套, 赋值运算
内容大纲: 一:字典的定义 二:字典的增加 >1:按照key增加, 无则增加,有则覆盖 >2:setdefault() ,无则增加,有则不变 三:字典的删除 >1:pop() ...
- TDictionary字典 记录 的赋值。
type TRen = record age: Integer; //把name定义成结构的属性. private Fname: string; procedure Setname(const Val ...
- .NET通过字典给类赋值
/// <summary> /// /// </summary> /// <typeparam name="T"></typeparam& ...
- [python]字典的直接赋值、浅拷贝和深拷贝解析
1.赋值引用 b = a: a 和 b 都指向同一个对象. 2.浅拷贝 b = a.copy(): a 和 b父对象是一个独立的对象,但他们的子对象还是指向统一对象(是引用). 3.深拷贝 b = ...
随机推荐
- hdu 5294 最短路+最大流 ***
处理处最短路径图,这个比较巧妙 链接:点我
- h264 profile & level
转自:http://blog.csdn.net/sphone89/article/details/17492433 H.264 Profiles H.264有四种profile,每个profile支持 ...
- ListView中每个item条目在被单击选中时能够高亮显示
在布局文件中设定: android:listSelector="@android:color/holo_red_light" 在代码中实现 listView.setSelector ...
- Understanding Execution Governors and Limits
在编写Salesforce后台代码的时候,如果数据量比较大,或者需要与数据库的交互比较频繁的话,那么会抛出一些限制的异常,来提示你让你做进一步的修改. 有这些限制实质上是跟Salesforce是一个云 ...
- hash 分区的用途是什么?
Hash partitioning enables easy partitioning of data that does not lend itself to rangeor list partit ...
- Android Fragment学习笔记(二)----Fragment界面添加和管理
Fragment界面添加 了解过fragment的生命周期等简单知识,于是去看官方文档来了解更多相关内容,要添加fragment到我们的UI界面中,给出了两种常用的方法,第一个是在activity的布 ...
- 利用scp传输文件小结
从本地复制到远程 scp mysql-5.5.29-linux2.6-x86_64.tar.gz 192.168.1.11:/opt 指定端口: scp -P 60022 /opt/ray/nginx ...
- Minitab中相关系数R-Sq和修正R-Sq(adj)的意思,计算公式和区别[转载]
转载自:http://www.pinzhi.org/thread-7762-1-1.html Minitab中相关系数R-Sq和修正的相关系数R-Sq(adj)的意思,计算公式和区别 在Minitab ...
- 浩瀚移动POS收银开单扫描解决方案PDA仓储系统,无线批发,移动批发,无线POS,无线销售APP-车销管理PDA
适用范围 各种业态的批发商铺.批发市场.订货会.展销会.配送中心仓库…… 产品简介 随着移动技术与智能PDA设备的迅猛发展,中国已经跨步进入移动信息化社会.移动商务是移动信息社会的重要载体与形式,它开 ...
- hdu 3518 Boring counting 后缀数组基础题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...