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
  • 相关阅读:
    Best Practices for Background Jobs_3 Managing Device Awake State之电源锁、Alarm、WakefulBroadcastReceiver
    一种扩大View点击范围的方法
    IntentService
    DNS
    GPU硬件加速相关
    SOA 面向服务的体系结构
    android APK 文件的生成过程
    PHP简介
    代码安装apk文件
    View 的 focus 和 selected 状态, TabContainer实现
  • 原文地址:https://www.cnblogs.com/fkunlam/p/5778800.html
Copyright © 2011-2022 走看看