關(guān)于iOS字典轉(zhuǎn)模型幾種方法

別人寫的黑滴,寫的不錯,收藏一波

1:KVC? ? 2:runTime字典轉(zhuǎn)模型

先說說兩種的不同:KVC是遍歷字典中的key值逆屡,去模型類里面去查找有沒有所對應(yīng)的key前鹅,runtime反之是遍歷屬性在字典里面去查找有沒有對應(yīng)的key,在實(shí)際開發(fā)中碌识,因?yàn)楹笈_返回的數(shù)據(jù)比較多碾篡,可用的字段就比較少,所以用runtime效率較高筏餐。

KVC原理:鍵值編碼是用來間接訪問對象屬性的機(jī)制开泽,通過setValue:forKey和ValueForkey來訪問成員變量,代碼量比較少使用比較簡單魁瞪。

使用方法:

1.創(chuàng)建一個Model類穆律,在.h里面聲明兩個方法,并且聲明需要的屬性(可以參照我寫的自動聲明屬性去完成這個步驟)

- (instancetype)initWithDictionary:(NSDictionary *)dict;

+ (instancetype)provinceWithDictionary:(NSDictionary *)dict;

2.在.m里面去實(shí)現(xiàn)

- (instancetype)initWithDictionary:(NSDictionary *)dict

{

if (self = [super init]) {

[self setValuesForKeysWithDictionary:dict];

}

return self;

}

+ (instancetype)provinceWithDictionary:(NSDictionary *)dict

{

return [[self alloc] initWithDictionary:dict];

}

3.在這里我們直接可以在ViewController里面調(diào)這個方法

VisitorModel *model = [VisitorModel provinceWithDictionary:temDic];就完成了賦值了

注意:我們在使用KVC過程中因?yàn)槭峭ㄟ^字典去在你模型類里面去查找有沒有這個屬性:或者字典里面有關(guān)鍵字:程序會拋出異常导俘,這里我們要玩成一個方法:

-(void)setValue:(id)value forUndefinedKey:(NSString *)key{

}

這個寫著就沒事了峦耘,如果是id類型,我們先聲明一個ID屬性旅薄,然后給它賦值辅髓。

KVC的使用就介紹這么多,使用起來也是很方便的少梁。

第二種:runtime字典轉(zhuǎn)模型

先說說一級的字典轉(zhuǎn)模型

步驟1.首先創(chuàng)建一個model類還是通過我封裝的自動聲明屬性洛口,然后把輸出的粘貼到.h里面

步驟2:直接調(diào)用我這封裝的就可以了,封裝內(nèi)部的原理如下

1.創(chuàng)建一個分類 NSObject (model)

2猎莲,在.h里面寫一個方法

+(instancetype)modelWithDic:(NSDictionary*)dict;只需要傳入一個字典就會自動轉(zhuǎn)模型的

3.在.m里面實(shí)現(xiàn)方法

+(instancetype)modelWithDic:(NSDictionary*)dict{

1.先創(chuàng)建一個類的對象

id objc =? [[self alloc]init];

2.//這里需要穿一個cout的地址绍弟,其中cout就是成員屬性總數(shù)

unsigned int count = 0;

3這個方法是把傳進(jìn)來的Model的成員變量屬性復(fù)制一分,其中Ivar*實(shí)際上就是只想一個成員變量的數(shù)組(注意區(qū)分成員屬性和屬性)

Ivar? *ivarPlist =class_copyIvarList(self, &count);

4.遍歷這個數(shù)字著洼,此時count的值已經(jīng)變成你成員變量屬性的個數(shù)

for (int i=0; i

(1):獲取到一個成員屬性名

Ivar ivar1 = ivarPlist[i];

(2):獲取到成員名

NSString *propertyName =? ? [NSString stringWithUTF8String: ivar_getName(ivar1)]

(3.)獲取到成員屬性(這個返回值是c語言樟遣,所以轉(zhuǎn)換了一下)

NSString *propertyType =? ? [NSString stringWithUTF8String:? ? ? ivar_getTypeEncoding(ivar1)];

(4),獲取key(注意成員屬性和屬性的區(qū)別)

NSString *key = [propertyName substringFromIndex:1];

(5)身笤,獲取Value

id Value= dict[key];

(6).通過KVC進(jìn)行賦值(因?yàn)閂alue如果為空豹悬,直接Crash,所以這里判斷了一下液荸,如果有值再去賦值)

if (Value) {

[objc setValue:Value forKey:key];//用kvc復(fù)制value不能為空

}

(7).return objc瞻佛;

}

這個方法也是比較容易理解的,上面只是介紹了一級字典轉(zhuǎn)模型,二級其實(shí)也非常簡單

二級字典轉(zhuǎn)模型:

假如我們返回?cái)?shù)據(jù)里面有一個字典伤柄,字典里面還有一個字典绊困,我們我們必須再創(chuàng)建一個UserMode類,然后自動生成屬性适刀,然后@class User; ? 再M(fèi)odel.h里面聲明這個屬性秤朗。

繼續(xù)在上面的for循環(huán)里面實(shí)現(xiàn)一下代碼:

判斷Value類型是不是字典,或者屬性名稱不包含NSDictionary

if ([Value isKindOfClass:[NSDictionary class]] &&![propertyType containsString:@"NS"]) {

1.直接將屬性類型轉(zhuǎn)換成類

Class modelClass =NSClassFromString(propertyType);

2.直接給賦值

if (modelClass) {

Value =? [modelClass modelWithDic:Value];

}

[注意:這里是不行的笔喉,因?yàn)榈陬愋娃D(zhuǎn)換成類返回值不是User? 而是@\"user “\]取视,所以你要進(jìn)行字符串截取,具體

propertyType substringFromIndex:range.location +range.length]

range =[propertyType rangeOfString:@"\""];

propertyType = [propertyType substringToIndex:range.location];

Class modelClass =NSClassFromString(propertyType);

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末常挚,一起剝皮案震驚了整個濱河市作谭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奄毡,老刑警劉巖折欠,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異秧倾,居然都是意外死亡怨酝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門那先,熙熙樓的掌柜王于貴愁眉苦臉地迎上來农猬,“玉大人,你說我怎么就攤上這事售淡〗锎校” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵揖闸,是天一觀的道長揍堕。 經(jīng)常有香客問我,道長汤纸,這世上最難降的妖魔是什么衩茸? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮贮泞,結(jié)果婚禮上楞慈,老公的妹妹穿的比我還像新娘。我一直安慰自己啃擦,他們只是感情好囊蓝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著令蛉,像睡著了一般聚霜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天蝎宇,我揣著相機(jī)與錄音弟劲,去河邊找鬼。 笑死姥芥,一個胖子當(dāng)著我的面吹牛函卒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撇眯,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼虱咧!你這毒婦竟也來了熊榛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤腕巡,失蹤者是張志新(化名)和其女友劉穎玄坦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绘沉,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡煎楣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了车伞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片择懂。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖另玖,靈堂內(nèi)的尸體忽然破棺而出困曙,到底是詐尸還是另有隱情,我是刑警寧澤谦去,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布慷丽,位于F島的核電站,受9級特大地震影響鳄哭,放射性物質(zhì)發(fā)生泄漏要糊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一妆丘、第九天 我趴在偏房一處隱蔽的房頂上張望锄俄。 院中可真熱鬧,春花似錦飘痛、人聲如沸珊膜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽车柠。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間竹祷,已是汗流浹背谈跛。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留塑陵,地道東北人感憾。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像令花,于是被迫代替她去往敵國和親阻桅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容