// // 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-10-05 18:01:39