在iOS開(kāi)發(fā)中,我們肯定會(huì)遇到字典轉(zhuǎn)模型.
一般實(shí)現(xiàn)方案有下面幾種:
1.自己手寫(xiě)轉(zhuǎn),別噴我,雖然很少有人這么干,但確實(shí)是最原始的方法??
2.KVC轉(zhuǎn)模型,優(yōu)點(diǎn)是代碼少了,缺點(diǎn)是需要再每一個(gè)模型中都要去寫(xiě)一遍
3.runtime實(shí)現(xiàn):在NSObject添加一個(gè)分類(lèi),寫(xiě)一個(gè)方法即可
優(yōu)點(diǎn):①不需要在每個(gè)模型去實(shí)現(xiàn),只需寫(xiě)一遍就可以
②效率原則上是比KVC高的,因?yàn)閞untime是從模型中拿屬性去字典中匹配,而KVC是遍歷字典,并且沒(méi)有定義成屬性的key還要去調(diào)用-(void)setValue:(id)value forUndefinedKey:(NSString *)key方法,這是讓我覺(jué)得runtime實(shí)現(xiàn)效率會(huì)高的原因.如果有誤,還希望大家伙指正??
分類(lèi)中實(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è)類(lèi)的成員變量列表 *count: 存放成員變量的地址
uint count = 0;
Ivar *ivarList = class_copyIvarList(self, &count);
// 遍歷成員變量數(shù)組
for (int i =0; i < count; i++) {
// 1.獲取成員變量
Ivar ivar = ivarList[i];
// 2.獲取成員變量名稱(chēng)
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
這樣模型類(lèi)調(diào)用modelWithDict方法即可實(shí)現(xiàn)最簡(jiǎn)單的模型一級(jí)轉(zhuǎn)換啦.