网上所有的字典转模型的三方框架最底层的实现原理莫过于此,你们去看一下就会明白了,比如MJExtension。
constchar*kPropertyListKey ="YFPropertyListKey";
+ (NSArray*)yf_objcProperties
{
/* 获取关联对象 */
NSArray*ptyList = objc_getAssociatedObject(self, kPropertyListKey);
/* 如果 ptyList 有值,直接返回 */
if(ptyList)
{return ptyList; }
/* 调用运行时方法, 取得类的属性列表 *//* 成员变量:
* class_copyIvarList(__unsafe_unretained Class cls, unsigned int *outCount)
* 方法:
* class_copyMethodList(__unsafe_unretained Class cls, unsigned int *outCount)
* 属性:
* class_copyPropertyList(__unsafe_unretained Class cls, unsigned int *outCount)
* 协议:
* class_copyProtocolList(__unsafe_unretained Class cls, unsigned int *outCount)
*/unsignedintoutCount =0;/**
* 参数1: 要获取得类
* 参数2: 类属性的个数指针
* 返回值: 所有属性的数组, C 语言中,数组的名字,就是指向第一个元素的地址
*//* retain, creat, copy 需要release */
objc_property_t *propertyList = class_copyPropertyList([selfclass], &outCount);
NSMutableArray*mtArray = [NSMutableArrayarray];
/* 遍历所有属性 */
for(unsignedinti =0; i < outCount; i++)
{
/* 从数组中取得属性 */
objc_property_t property = propertyList[I];
/* 从 property 中获得属性名称 */
constchar*propertyName_C = property_getName(property);
/* 将 C 字符串转化成 OC 字符串 */
NSString*propertyName_OC = [NSStringstringWithCString:propertyName_C encoding:NSUTF8StringEncoding];
[mtArray addObject:propertyName_OC];
}/* 设置关联对象 *//**
* 参数1 : 对象self
* 参数2 : 动态添加属性的 key
* 参数3 : 动态添加属性值
* 参数4 : 对象的引用关系
*/
objc_setAssociatedObject(self, kPropertyListKey, mtArray.copy, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
/* 释放 */
free(propertyList);
returnmtArray.copy;
}
+ (instancetype)modelWithDict:(NSDictionary*)dict
{
/* 实例化对象 */
idobjc = [[selfalloc]init];
/* 使用字典,设置对象信息 */
/* 1. 获得 self 的属性列表 */
NSArray*propertyList = [selfyf_objcProperties];
/* 2. 遍历字典 */
[dict enumerateKeysAndObjectsUsingBlock:^(id_Nonnull key,id_Nonnull obj,BOOL* _Nonnull stop) {
/* 3. 判断 key 是否字 propertyList 中 */
if([propertyList containsObject:key])
{
/* 说明属性存在,可以使用 KVC 设置数值 */
[objc setValue:obj forKey:key];
}
}];
/* 返回对象 */
returnobjc;
}
//总结:
首先获取model所有的属性列表
再然后根据dict的key来往里面添加value