利用runTime,实现以模型为主的字典转模型(注意与KVC的区别)

  将字典转化为模型,面向模型开发,是在开发中最为常用的功能。利用KVC可以将字典转换为模型,但是前提有三个约束,一个是必须保证模型的属性个数大于等于字典个数,二是属性名称与字典的key必须相同,三是对于模型中的基本数据类型无法转换。

  其中第一条与第三条,是其最大的弊端。例如,如果从服务器获取的数据字典,并不想使用所有的键值对。但是在开发中还是必须得全部将对应属性列出,全部进行转换(除非你一个一个写,不使用KVC)。

  下面的代码就可以解决上述问题:实现以模型为主,将字典数据进行部分转化,并识别基本数据类型。约束仅仅是要求模型属性名称与字典KEY保持一致(因为底层还是使用KVC);


 1 //
2 // NSObject+Value.m
3 //
4 // Created by shunzi 5-10-2014.
5 // Copyright (c) 2014年 shunzi. All rights reserved.
6 //
7
8 #import "NSObject+Value.h"
9 #import <objc/message.h>
10 #import <objc/runtime.h>
11
12 @implementation NSObject (Value)
13 - (void)setValues:(NSDictionary *)values
14 {
15 Class c = [self class];
16
17 while (c) {
18 // 1.获得所有的成员变量
19 unsigned int outCount = 0;
20 Ivar *ivars = class_copyIvarList(c, &outCount);
21
22 for (int i = 0; i<outCount; i++) {
23 Ivar ivar = ivars[i];
24
25 // 2.属性名
26 NSMutableString *name = [NSMutableString stringWithUTF8String:ivar_getName(ivar)];
27
28 // 删除最前面的_
29 [name replaceCharactersInRange:NSMakeRange(0, 1) withString:@""];
30
31 // 3.取出属性值
32 NSString *key = name;
33 if ([key isEqualToString:@"desc"]) {
34 key = @"description";
35 }
36 if ([key isEqualToString:@"ID"]) {
37 key = @"id";
38 }
39 id value = values[key];
40 if (!value) continue;
41
42 // 4.SEL
43 // 首字母
44 NSString *cap = [name substringToIndex:1];
45 // 变大写
46 cap = cap.uppercaseString;
47 // 将大写字母调换掉原首字母
48 [name replaceCharactersInRange:NSMakeRange(0, 1) withString:cap];
49 // 拼接set
50 [name insertString:@"set" atIndex:0];
51 // 拼接冒号:
52 [name appendString:@":"];
53 SEL selector = NSSelectorFromString(name);
54
55 // 5.属性类型
56 NSString *type = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];
57
58 if ([type hasPrefix:@"@"]) { // 对象类型
59 objc_msgSend(self, selector, value);
60 } else { // 非对象类型
61 if ([type isEqualToString:@"d"]) {
62 objc_msgSend(self, selector, [value doubleValue]);
63 } else if ([type isEqualToString:@"f"]) {
64 objc_msgSend(self, selector, [value floatValue]);
65 } else if ([type isEqualToString:@"i"]) {
66 objc_msgSend(self, selector, [value intValue]);
67 } else {
68 objc_msgSend(self, selector, [value longLongValue]);
69 }
70 }
71 }
72
73 c = class_getSuperclass(c);
74 }
75 }
76 @end

头文件仅仅包含对此方法的声明,所以不在此粘贴

时间: 2024-10-13 13:57:20

利用runTime,实现以模型为主的字典转模型(注意与KVC的区别)的相关文章

利用runtime实现更加灵活的KVC

字典转模型在iOS开发中属于非常常见的操作. 比较简单的方式是 KVC ,但是这样会有一个局限 ,就是 模型中的属性必须和字典中的完全匹配,否则,KVC将会报错. 手动编写代码虽然比较灵活,但是如果字典中数据量庞大,也会是一个糟糕的体验. 针对以上问题,利用runtime实现一个更加灵活的字典转模型. 1.为 NSObject建立一个分类 NSObject+GQRuntimeTool.h文件 #import <Foundation/Foundation.h> @interface NSObje

IOS开发UI基础之Plis文件-字典转模型

什么是plist文件? 在开发中直接将数据写在代码里面 不是一种合理的做法 如果数据经常改变 就需要经常翻开对应的代码进行修改 造成代码扩展性低 因此,可以考虑将经常变的数据放在?文件中进?行存储,程序启动后从?文件中 读取最新的数据.如果要变动数据,直接修改数据?文件即可,不?用修改代码 一般可以使?用属性列表?文件存储NSArray或者NSDictionary之类的数据,这 种“属性列表?文件”的扩展名是plist,因此也称为“plist?文件” 在Xcode创建plist文件的步骤: 解析

利用runtime字典转模型

目的: 在日常开发中我们从字典中取出数据时,往往有可能会因为字典某一个key为关键字,或者我们自己改了,而模型里面可能一共有几十个属性,那么难道我们还要去一个个去写,那还不写到吐血.今天我就来分享如何使用runtime来把字典转换成模型.(这里字典里面是id,但是是关键字,所以模型里面我们是用的ID,所以需要转换) 步骤: 1.首先依然是不要忘记导入头文件 #import <objc/runtime.h> 2.首先自定义一个类方法,用来字典转模型,传入参数要转换的字典,还一个就是用来存放被你修

ios开发runtime学习五:KVC以及KVO,利用runtime实现字典转模型

一:KVC和KVO的学习 #import "StatusItem.h" /* 1:总结:KVC赋值:1:setValuesForKeysWithDictionary实现原理:遍历字典,得到所有的key,value值,再利用kvc, setVaue forkey来为value赋值 2: [item setValue:@"来自即刻笔记" forKey:@"source"],内部的底层实现, 1.首先去模型中查找有没有setSource,找到,直接调用

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

现在的ios开发中,我们通常会使用MVC模式.当我们拿到数据的时候,我们要把数据转成模型使用. 一般情况我们拿到的数据都是字典.这是我们就需要将字典转成模型对象了. 当对象的属性很少的时候,我们可以直接单独写出字典的键值,进行转换. _属性 = dict["键"] 当对象的属性很多的时候,我们可以利用KVC批量设置. setValuesForKeysWithDictionary:<#(NSDictionary *)#> 但是KVC批量转的时候,有个致命的缺点,就是当字典中的

福利-&gt;KVC+Runtime获取类/对象的属性/成员变量/方法/协议并实现字典转模型

我们知道,KVC+Runtime可以做非常多的事情.有了这个,我们可以实现很多的效果. 这里来个福利,利用KVC+Runtime获取类/对象的所有成员变量.属性.方法及协议: 并利用它来实现字典转模型. 废话不多说,直接上代码: 1.工具类(其实就是NSObject的一个分类)头文件 1 #import <Foundation/Foundation.h> 2 3 @interface NSObject (YSRuntime) 4 5 /** 6 返回当前类的属性数组 7 8 @return 属

字典转模型KVC和runtime二者实现与区别

我们知道在开发中,字典转模型是一种很常用的设计模式,当字典中元素的个数比较少的时候,我们可以直接用dic[key]去给模型对象的属性赋值,但是当字典中元素的个数比较多的时候,再用前面的解决方法就不行了,所以就有了KVC(key value coding:键值编码)字典转模型的设计模式. KVC的设计原理: [item setValue:@"value" forKey:@"property"]: 1.首先去模型中查找有没有setProperty,找到,直接调用赋值 [

iOS开发——高级技术精选OC篇&amp;Runtime之字典转模型实战

Runtime之字典转模型实战 如果您还不知道什么是runtime,那么请先看看这几篇文章: http://www.cnblogs.com/iCocos/p/4734687.html http://www.cnblogs.com/iCocos/p/4676679.html http://www.cnblogs.com/iCocos/p/4725527.html 关于runtime的详细介绍及其相关的小实例 好了,这里就不多废话了,直接开干! 先来看看怎么使用Runtime给模型类赋值 iOS开发

Runtime-字典转模型KVC实现

// // NSObject+Model.m // 05-runtime(字典转模型KVC实现) // // Created by kun on 16/8/17. // Copyright © 2016年 kun. All rights reserved. // #import "NSObject+Model.h" #import <objc/message.h> @implementation NSObject (Model) + (instancetype)modelW