【iOS开发】字典的快速赋值 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
正常输出!
原文链接:http://www.jianshu.com/p/870eb4b4170a
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
【iOS开发】字典的快速赋值 setValuesForKeysWithDictionary的更多相关文章
- 字典的快速赋值 setValuesForKeysWithDictionary
字典的快速赋值 setValuesForKeysWithDictionary 前言 在学习解析数据的时候,我们经常是这么写的:PersonModel.h文件中 @property (nona ...
- iOS开发--字典(NSDictionary)和JSON字符串(NSString)之间互转
iOS开发--字典(NSDictionary)和JSON字符串(NSString)之间互转 1. 字典转Json字符串 // 字典转json字符串方法 -(NSString *)convertToJs ...
- iOS开发—字典转模型,KVC设计模式
iOS开发UI基础—字典转模型 开发中,通常使用第三方框架可以很快的实现通过字典转模型,通过plist创建模型,将字典的键值对转成模型属性,将模型转成字典,通过模型数组来创建一个字典数组,通过字典数组 ...
- iOS开发——多线程篇——快速生成沙盒目录的路径,多图片下载的原理、SDWebImage框架的简单介绍
一.快速生成沙盒目录的路径 沙盒目录的各个文件夹功能 - Documents - 需要保存由"应用程序本身"产生的文件或者数据,例如:游戏进度.涂鸦软件的绘图 - 目录中的文件会被 ...
- iOS开发- 三步快速集成社交化分享工具ShareSDK
1.前言 作为现在App里必不可少的用户分享需要,社交化分享显然是我们开发app里较为常用的. 最近因为公司App有社交化分享的需要,就特此研究了会,拿出来与大家分享. 想要集成社交会分享,我们可以使 ...
- iOS开发——项目需求-快速回到当前界面的顶部
利用UIWindow实现快速到达顶部 如下图,在状态栏添加一个没有颜色的UIWindow(里面添加一个按钮),实现点击这个按钮时能快速的回到当前界面的顶部 核心代码 一.利用UIWindow实现到达顶 ...
- iOS开发——实用篇&KVO与KVC详解
KVO与KVC详解 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC ...
- iOS开发之使用Runtime给Model类赋值
本篇博客算是给网络缓存打个基础吧,本篇博客先给出简单也是最容易使用的把字典转成实体类的方法,然后在给出如何使用Runtime来给Model实体类赋值.本篇博客会介绍一部分,主要是字典的key与Mode ...
- ios开发- 利用运行时(runtime)字典转模型
现在的ios开发中,我们通常会使用MVC模式.当我们拿到数据的时候,我们要把数据转成模型使用. 一般情况我们拿到的数据都是字典.这是我们就需要将字典转成模型对象了. 当对象的属性很少的时候,我们可以直 ...
随机推荐
- JDBC jar包
密码qiij https://pan.baidu.com/share/init?surl=oBfMwQ6rd9t6VNjIluF1qw
- rest_framework --- APIView
一.什么是rest_framework 它是基于Django的,帮助我们快速开发符合RESTful规范的接口框架. 安装方式有很多种,可以通过pip,或者在pycharm中安装也可以 二.APIVie ...
- [国家集训队]小Z的袜子(莫队,概率)
题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编 ...
- mongo复制集脑裂问题如何处理
mongo replication 脑裂问题如何处理: 一.问题描述:一套mongo replication有4个节点.1个仲裁节点.在停止实例(或实例毁坏)的时候,导致所有节点都变为SECONDAR ...
- samba文件共享服务的配置
samba文件共享服务的配置 服务端配置 一.安装samba软件包 命令:yum -y install samba 查看是否安装samba. [root@Centos7-Server haha]# [ ...
- Apache和Nignx基于三种方式搭建web站点并设置用户访问控制达到优化整个站点性能
个人用户主页: 1:Vim /etc/http/con.d/userdir: UserDir disabled //个人用户主页开启 UserDir public_html //指定 ...
- vue渲染自定义json数据
<template> <div class="wrap"> <div class="main"> <div class ...
- c#学习笔记《1》——regex类
C#regex是正则表达式类用于string的处理,查找匹配的字符串.1,先看一个例子Regex regex=new Regex(@”OK“)://我们要在目标字符串中找到"OK" ...
- Linux中程序的编译和链接过程
1.从源码到可执行程序的步骤:预编译.编译.链接.strip 预编译:预编译器执行.譬如C中的宏定义就是由预编译器处理,注释等也是由预编译器处理的. 编译: 编译器来执行.把源码.c .S编程机器码. ...
- go学习笔记-语言基础
语言基础 结构 基础组成: 包声明 引入包 函数 变量 语句 & 表达式 注释 程序 在开始编写应用之前,我们先从最基本的程序开始,在学习大部分语言之前,都会编写一个可以输出hello wor ...