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)modelWithDict:(NSDictionary *)dict
{
    id objc = [[self alloc] init];

    // Ivar:成员变量
    // Property:属性
    // runtime:根据模型中属性,去字典中取出对应的value给模型属性赋值
    // 获取哪个类的成员变量
    // 获取模型中所有属性 key
    // count:成员变量的个数
    unsigned int count = 0;
    // 获取成员变量的数组
    Ivar *ivarList = class_copyIvarList(self, &count);
    // 遍历所有成员变量
    for (int index = 0; index < count; index++ )
    {
        // 获取成员变量
        Ivar ivar = ivarList[index];
        // 获取成员变量的名字
        NSString *ivarName = [NSString stringWithUTF8String:ivar_getName(ivar)];
        // 获取key
        NSString *key = [ivarName substringFromIndex:1];
        // 去字典中查找对应的value
        id value = dict[key];
        // 获取成员变量的类型
        NSString *ivarType = [NSString stringWithUTF8String: ivar_getTypeEncoding(ivar)];
        // “@\"ClassName\"” -> ClassName
        ivarType = [ivarType stringByReplacingOccurrencesOfString:@"@" withString:@""];
        ivarType = [ivarType stringByReplacingOccurrencesOfString:@"\"" withString:@""];
        // 二级转换:判断下value是否字典,如果是,字典转换层对应的模型
        // 并且是自定义对象才需要转换
        if ( [value isKindOfClass:[NSDictionary class]] && ![ivarType hasPrefix:@"NS"] )
        {
            // 转成哪个模型
            // 获取类
            Class modelClass = NSClassFromString(ivarType);
            value = [modelClass modelWithDict:dict];
        }
        // 给模型中属性赋值
        if ( value )
            [objc setValue:value forKey:key];
    }
    // 根据属性名去字典中查找value
    // 给模型中属性赋值KVC

    return objc;
}
@end
时间: 2024-07-31 09:22:40

Runtime-字典转模型KVC实现的相关文章

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

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

利用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,找到,直接调用

福利-&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 属

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

将字典转化为模型,面向模型开发,是在开发中最为常用的功能.利用KVC可以将字典转换为模型,但是前提有三个约束,一个是必须保证模型的属性个数大于等于字典个数,二是属性名称与字典的key必须相同,三是对于模型中的基本数据类型无法转换. 其中第一条与第三条,是其最大的弊端.例如,如果从服务器获取的数据字典,并不想使用所有的键值对.但是在开发中还是必须得全部将对应属性列出,全部进行转换(除非你一个一个写,不使用KVC). 下面的代码就可以解决上述问题:实现以模型为主,将字典数据进行部分转化,并识别基本数

iOS彩票项目--第七天,初次读取json数据、KVC转模型技巧、运行时字典转模型以及初步对显示网页的操作并且跟踪标签

一.初次读取json数据 二.KVC转模型技巧,这里的技巧主要解决的是字典中的key 与 模型中有的属性对应不起来的时候 的解决办法 <方法1> <方法2>运行时字典转模型,运行时自己一直很晕.不过还是整理下来,方便以后用. 这里直接创建了一个分类. 头文件代码 1 // 2 // NSObject+Model.h 3 // Chaos_G 4 // 5 6 #import <Foundation/Foundation.h> 7 8 @interface NSObjec

iOS之KVC字典转模型的底层实现

KVC: Key Value Coding (键值编码) 在iOS开发中,KVC是我们经常要使用的技术.那么KVC有什么作用呢?简单列举一下下面几种: 取值和赋值(开发中基本不用) 获取对象私有变量的值.(经常使用,例如UIPageContorl分页, 设置圆点为图片) 改变对象私有变量的值(经常使用) 简单的字典转模型(偶尔使用) 模型转字典 批量取值 KVC字典转模型的底层实现 通常我们手动将字典转模型的话,会在模型中提供一个类方法接收一个字典,在这个方法中将字典转换成模型,再将转换好的模型

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

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

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开发