在iOS開發(fā)中,我們肯定會(huì)遇到字典轉(zhuǎn)模型.
一般實(shí)現(xiàn)方案有下面幾種:
1.自己手寫轉(zhuǎn),別噴我,雖然很少有人這么干,但確實(shí)是最原始的方法??
2.KVC轉(zhuǎn)模型,優(yōu)點(diǎn)是代碼少了,缺點(diǎn)是需要再每一個(gè)模型中都要去寫一遍
3.runtime實(shí)現(xiàn):在NSObject添加一個(gè)分類,寫一個(gè)方法即可
優(yōu)點(diǎn):①不需要在每個(gè)模型去實(shí)現(xiàn),只需寫一遍就可以
②效率原則上是比KVC高的,因?yàn)閞untime是從模型中拿屬性去字典中匹配,而KVC是遍歷字典,并且沒有定義成屬性的key還要去調(diào)用-(void)setValue:(id)value forUndefinedKey:(NSString *)key方法,這是讓我覺得runtime實(shí)現(xiàn)效率會(huì)高的原因.如果有誤,還希望大家伙指正??
分類中實(shí)現(xiàn)的方法代碼如下:
#import "NSObject+Model.h"
#import <objc/message.h>
@implementation NSObject (Model)
// runtime:遍歷模型中的屬性,去字典中取出對(duì)應(yīng)的value,給屬性賦值
+ (instancetype)modelWithDict:(NSDictionary *)dict
{
id objc = [[self alloc]init];
// 1.獲取模型中的所有屬性 (我們?nèi)〕蓡T變量,更加嚴(yán)謹(jǐn)而且是copy)
// ivar:成員變量 property:屬性
// class:獲取哪個(gè)類的成員變量列表 *count: 存放成員變量的地址
uint count = 0;
Ivar *ivarList = class_copyIvarList(self, &count);
// 遍歷成員變量數(shù)組
for (int i =0; i < count; i++) {
// 1.獲取成員變量
Ivar ivar = ivarList[i];
// 2.獲取成員變量名稱
NSString *ivarName = [NSString stringWithUTF8String:ivar_getName(ivar)];
// 3.從字典中取出對(duì)應(yīng)的value
NSString *key = [ivarName substringFromIndex:1];
id value = dict[key];
// 4.給模型中對(duì)于屬性賦值
[objc setObject:value forKey:key];
}
return objc;
}
@end
這樣模型類調(diào)用modelWithDict方法即可實(shí)現(xiàn)最簡(jiǎn)單的模型一級(jí)轉(zhuǎn)換啦.