zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    三星t5拆解
    一条 SQL 引发的事故,同事直接被开除!!
    Git 不能提交空目录?我也是醉了!
    Redis 6.0.8 紧急发布,请尽快升级!
    String.format() 图文详解,写得非常好!
    为什么 Redis 要比 Memcached 更火?
    Lambda 表达式入门,这篇够了!
    天啊,为什么我的 Redis 变慢了。。
    写出一手烂代码的 19 条准则!
    Redis 面试一定要知道的 3 个 问题!
  • 原文地址:https://www.cnblogs.com/fkunlam/p/5778800.html
Copyright © 2011-2022 走看看