//
// 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