runtime實(shí)現(xiàn)字典轉(zhuǎn)模型(一)

在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)換啦.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 對(duì)于從事 iOS 開發(fā)人員來說,所有的人都會(huì)答出【runtime 是運(yùn)行時(shí)】什么情況下用runtime?大部分人能...
    夢(mèng)夜繁星閱讀 3,812評(píng)論 7 64
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,068評(píng)論 0 9
  • 今天我們一家去原山公園玩,重點(diǎn)是兒童游樂園,走鋼索,過原木橋,走木板橋,雖然有些難度,女兒去勇敢的嘗試,一次,...
    不知有漢驥無論魏晉章閱讀 107評(píng)論 0 0
  • 今天中午吃飯的時(shí)候看到探索頻道播出了關(guān)于企鵝在南極的生活,其中有一個(gè)場(chǎng)景讓我十分的震驚! 南半球的冬季十分寒冷,是...
    將軍府上閱讀 1,263評(píng)論 0 0
  • 001,萬事開頭難,難在于不敢想象成功后的情景及好的結(jié)果帶來的推動(dòng)力,所以第一次成功非常重要,也是從側(cè)面說明自信心...
    梅子的春天閱讀 342評(píng)論 0 1

友情鏈接更多精彩內(nèi)容