runtime與KVC字典轉(zhuǎn)模型的區(qū)別:
1.KVC:遍歷字典中所有的key光绕,去模型中查找有沒有對應(yīng)的屬性名女嘲。
2.runtime:遍歷模型中的屬性名,去字典中查找。
#依舊是NSObjcet的model分類
//字典轉(zhuǎn)模型 -- runtime 實現(xiàn)
#import <Foundation/Foundation.h>
#import <objc/message.h>
@interface NSObject (Model)
+ (instancetype)modelWithDict:(NSDictionary *)dict;
@end
# .m文件中
+ (instancetype)modelWithDict:(NSDictionary *)dict{
// 創(chuàng)建對應(yīng)類的對象
id objc =[[self alloc] init];
/**
runtime:遍歷模型中的屬性名诞帐。去字典中查找欣尼。
屬性定義在類,類里面有個屬性列表(即為數(shù)組)
*/
# 方法名:class_copyIvarList(<#__unsafe_unretained Class cls#>, <#unsigned int *outCount#>)
// 遍歷模型所有屬性名
#1. ivar : 成員屬性(成員屬性為帶_name,而name為屬性停蕉,屬性與成員屬性不一樣愕鼓。)
#2. class_copyIvarList:把成員屬性列表復制一份給你
#3. cmd + 點擊 查看方法返回一個Ivar *(表示指向一個ivar數(shù)組的指針)
#4.class:獲取哪個類的成員屬性列表
#5.count : 成員屬性總數(shù)
unsigned int count = 0;
Ivar *ivarList = class_copyIvarList(self, &count);
// 遍歷
for (int i = 0; i< count; i++){
Ivar ivar = ivarList[i];
// 獲取成員名(獲取到的是C語言類型钙态,需要轉(zhuǎn)換為OC字符串)
NSString *propertyName = [NSString stringWithUTF8String:ivar_getName(ivar)];
// 成員屬性類型
NSString *propertyType = [NSString stringWithUTF8String: ivar_getTypeEncoding(ivar)];
// 首先獲取key(根據(jù)你的propertyName 截取字符串)
NSString *key = [propertyName substringFromIndex:1];
// 獲取字典的value
id value = dict[key];
// 給模型的屬性賦值
// value : 字典的值
// key : 屬性名
if (value){ // 這里是因為KVC賦值,不能為空
[objc setValue:value forKey:key];
}
NSLog(@"%@ %@",propertyType,propertyName);
}
NSLog(@"%zd",count); // 這里會輸出self中成員屬性的總數(shù)
return objc;
}
#viewController中
NSMutableArray *models = [NSMutableArray array];
for (NSDictionary *dict in dictArr){
// 字典轉(zhuǎn)模型(別忘記導入model類)
Model *modle = [Model modelWithDict:dict];
[models addOBject:model];
}
NSLog(@"%@",models);