博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字典的快速赋值 setValuesForKeysWithDictionary
阅读量:5844 次
发布时间:2019-06-18

本文共 3238 字,大约阅读时间需要 10 分钟。

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

正常输出!

转载地址:http://wdqcx.baihongyu.com/

你可能感兴趣的文章
数据库union ,和union all
查看>>
SQL 2005删除作业计划出错(DELETE语句与 REFERENCE约束"FK_subplan_job_id"冲突。)的解决...
查看>>
获取帮助
查看>>
7.4.4 IPv6的地址空间及其表示方法
查看>>
【Touch&input 】支持多个游戏控制器(18)
查看>>
2014年云计算五大趋势
查看>>
我的友情链接
查看>>
Java新手看招 常用开发工具介绍
查看>>
Windows Server 2008更改用户的环境变量和系统环境变量
查看>>
SQL语句学习
查看>>
初次安装系统注意选项
查看>>
mysql的SQL性能监控
查看>>
使用Dockerfile构建镜像
查看>>
大学生IT博客大赛开赛 相关报道
查看>>
tcpdump使用方法总结
查看>>
What is Cluster Aware Updating in Windows Server 2012?
查看>>
Linux命令详解 -- tar
查看>>
Java.net.URL学习总结
查看>>
Tracert(跟踪路由)是路由跟踪实用程序,用于确定 IP 数据包访问目标所采取的路径。...
查看>>
进老男孩的自我介绍和决心书
查看>>