簡(jiǎn)單實(shí)現(xiàn)MJExtension(一) -- 字典轉(zhuǎn)模型
三、字典數(shù)組 to 模型
#pragma mark - 復(fù)雜字典 轉(zhuǎn) 模型
- (void)keyValuesArrayToObject {
// 1.定義一個(gè)字典數(shù)組
NSArray *dictArray = @[
@{
@"name" : @"Jack",
@"icon" : @"lufy.png",
},
@{
@"name" : @"Rose",
@"icon" : @"nami.png",
}
];
}
在 NSObject+Extension.m 文件中添加方法+ objectArrayFromKeyValuesArray:
+ (NSMutableArray *)objectArrayFromKeyValuesArray:(NSArray *)keyValuesArray {
// 1.創(chuàng)建數(shù)組
NSMutableArray *modelArray = [NSMutableArray array];
// 2.遍歷傳進(jìn)來(lái)的字典數(shù)組
for (NSDictionary *keyValues in keyValuesArray) {
if ([keyValues isKindOfClass:[NSArray class]]) {
[modelArray addObject:[self objectArrayFromKeyValuesArray:(NSArray *)keyValues]];
}
else {
id model = [self objectFromKeyValue:keyValues];
if (model) {
[modelArray addObject:model];
}
}
}
return modelArray;
}
回到ViewController 在字典數(shù)組下面
NSArray *modelArr = [YLUserModel objectArrayFromKeyValuesArray:dictArray];
for (YLUserModel *user in modelArr) {
NSLog(@"name = %@",user.name);
}

字典數(shù)組 to 模型 的輸出.png
四、用自定義的屬性名接收key
#pragma mark - 用自定義的屬性名接收key
- (void)keyValuesArrayToObjectReplace {
// 1.定義一個(gè)字典
NSDictionary *dict = @{
@"id" : @"20",
@"desciption" : @"好孩子",
@"name" : @"Jack",
};
}
// 在模型里實(shí)現(xiàn)協(xié)議
+ (NSDictionary *)replacedKeyFromPropertyName {
return @{
@"ID" : @"id",
@"desc" : @"desciption"
};
}
修改 + objectFromKeyValue: 方法
+ (instancetype)objectFromKeyValue:(NSDictionary*)keyValue {
id obj = [[self alloc]init];
unsigned int count;
// 獲取成員變量數(shù)組:注意:只會(huì)獲取當(dāng)前類的屬性,不會(huì)獲取父類
Ivar *ivarList = class_copyIvarList(self, &count);
// 遍歷
for (int i = 0; i < count; i++) {
Ivar ivar = ivarList[i];
// 獲取成員變量名字
NSString *ivarName = [NSString stringWithUTF8String:ivar_getName(ivar)];
//NSLog(@"ivarName = %@",ivarName);//_age _name _icon _height _money
// 截取 - 獲得模型的屬性名
NSString *modelProperty = [ivarName substringFromIndex:1];
//NSLog(@"modelProperty = %@",key);//age name icon height money
NSString *keyBeReplaced; // 判斷是否要被替換 不判斷會(huì)死
if ([self respondsToSelector:@selector(replacedKeyFromPropertyName)]) {
keyBeReplaced = [self replacedKeyFromPropertyName][modelProperty];
}
// 獲取字典里的值 (判斷是否是被替換的)
id value;
if (keyBeReplaced) {
value = keyValue[keyBeReplaced];
}
else{
value = keyValue[modelProperty];
}
// 復(fù)雜字典,里面還有字典
// 所以要獲取成員變量的類型
NSString *ivarType = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];
// @\"YLUserModel\" 需要截取 ,否則下面的 secIvarClass 是不存在的(這里要好好看下MJExtension,這個(gè)解決方式比較low)
ivarType = [ivarType stringByReplacingOccurrencesOfString:@"@" withString:@""];
ivarType = [ivarType stringByReplacingOccurrencesOfString:@"\"" withString:@""];
//NSLog(@"ivarType = %@",ivarType);
if ([value isKindOfClass:[NSDictionary class]] && ![ivarType hasPrefix:@"NS"]) {
Class secIvarClass = NSClassFromString(ivarType);
value = [secIvarClass objectFromKeyValue:value];
NSLog(@"");
}
// 賦值
[obj setValue:value forKey:modelProperty];
}
return obj;
}
回到ViewController 在字典下面
YLUserModel *user = [YLUserModel objectFromKeyValue:dict];
NSLog(@"name = %@,ID = %@,desc = %@",user.name,user.ID,user.desc);

用自定義的屬性名接收key 的輸出.png
今天到此結(jié)束,下次的是字典里有數(shù)組,數(shù)組里又有字典的情況