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

 

posted on 2016-08-17 10:04  FKunLam  阅读(154)  评论(0编辑  收藏  举报