iOS利用runtime進行字典轉模型

在iOS開發(fā)當中model類是必不可少的,將json轉化為model也是必不可少的一步⊥锱福基本的字典轉模型基本上是下面這種情況

- (id)initWithDictionary:(NSDictionary *)dict{
    if (self = [super init]) {
        self.name    = dict[@"name"];
        self.age     = dict[@"age"];
        self.intro   = dict[@"intro"];
        self.friends = dict[@"friends"];
    }
    return self;
}

這樣做的好處就是簡單明了,適合初學者悍缠。但是應用在項目中就不是那么理想了卦绣,一個項目動輒幾十個model一個Model的屬性也很多這樣一條條賦值顯然不明智。

利用runtime進行字典轉模型

runtime的基礎只是不做過多介紹可自行翻文檔進行查閱飞蚓,下面我們就利用runtime來查找自身變量從而進行賦值操作

Ivar *ivarList = class_copyIvarList(cls, &count);

class_copyIvarList獲得的是Ivar數(shù)組滤港,即當前對象的變量列表,然后我們通過便利數(shù)組可以獲得每條變量的信息
利用ivar_getName可以獲得變量名趴拧,利用:ivar_getTypeEncoding可以獲得變量類型信息需要注意的是property聲明的屬性會在變量名前面加_ 下劃線溅漾,在setValue:forKey 的時候需要截掉這個下劃線

然后就是賦值過程

if ([[dict allKeys] containsObject:key]) {
                id value = dict[key];
                /*
                 在OC里指針的類型與聲明的類型無關,指向什么類型才是它的類型著榴,舉個例子
                 NSString *aString = [@{@"key":@4} objectForKey:@"key"];
                 NSLog(@"%@========",[string substringFromIndex:0]);
                 這兩行代碼會報錯添履,錯誤原因是[__NSCFNumber substringFromIndex:]: unrecognized selector sent to instance 也就是說這里的aString實際上是NSNumber類型的
                 在網(wǎng)絡請求中,我們接收到的數(shù)字類的數(shù)據(jù)類型往往不一定會是string類型的 但是我們希望用string來
                 處理它脑又,所以這里需要做強制的初始化確保類型的正確
                 */
                if ([ivarType isEqualToString:@"@\"NSString\""]) {
                    NSString *stringValue = [NSString stringWithFormat:@"%@",value];
                    
                    if (!JK_IS_STR_NIL(stringValue)) {
                        [model setValue:value forKey:key];
                    }else{
                        [model setValue:@"" forKey:key];
                    }
                    //對于字典類型的數(shù)據(jù)在業(yè)務中可能用一個model來接收
                }else if ([value isKindOfClass:NSClassFromString(@"NSDictionary")]&&![ivarType isEqualToString:@"@\"NSDictionary\""]){
                    
                    Class objClass = NSClassFromString([ivarType substringWithRange:NSMakeRange(2, ivarType.length-3)]);
                    
                    NSObject *obj = [objClass modelWithDict:value];
                    
                    [model setValue:obj forKey:key];
                }else{
                    if (value) {
                        [model setValue:value forKey:key];
                    }
                }

根據(jù)自己的業(yè)務需要進行相應的封裝暮胧,在我自己的業(yè)務中因為我習慣性用NSString接收所有的數(shù)據(jù)類型,所以我會將接收到的數(shù)據(jù)類型都初始化成string防止出錯
另外在如果需要在實體中將另一個類作為屬性问麸,我們可以通過NSClassFromString來生成這個類然后重新進行一次modelWithDic操作就可以啦往衷。

這樣基本功能就有了,我們把上述代碼寫進NSObject擴展里就可以擴展出字典轉模型的方法了 附上git地址

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末严卖,一起剝皮案震驚了整個濱河市席舍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌哮笆,老刑警劉巖来颤,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汰扭,死亡現(xiàn)場離奇詭異,居然都是意外死亡脚曾,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門启具,熙熙樓的掌柜王于貴愁眉苦臉地迎上來本讥,“玉大人,你說我怎么就攤上這事鲁冯】椒校” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵薯演,是天一觀的道長撞芍。 經(jīng)常有香客問我,道長跨扮,這世上最難降的妖魔是什么序无? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮衡创,結果婚禮上帝嗡,老公的妹妹穿的比我還像新娘。我一直安慰自己璃氢,他們只是感情好哟玷,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著一也,像睡著了一般巢寡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上椰苟,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天抑月,我揣著相機與錄音,去河邊找鬼舆蝴。 笑死爪幻,一個胖子當著我的面吹牛,可吹牛的內容都是我干的须误。 我是一名探鬼主播挨稿,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼京痢!你這毒婦竟也來了奶甘?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤祭椰,失蹤者是張志新(化名)和其女友劉穎臭家,沒想到半個月后疲陕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡钉赁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年蹄殃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片你踩。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡诅岩,死狀恐怖,靈堂內的尸體忽然破棺而出带膜,到底是詐尸還是另有隱情吩谦,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布膝藕,位于F島的核電站式廷,受9級特大地震影響,放射性物質發(fā)生泄漏芭挽。R本人自食惡果不足惜滑废,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望袜爪。 院中可真熱鬧策严,春花似錦、人聲如沸饿敲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怀各。三九已至倔韭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瓢对,已是汗流浹背寿酌。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留硕蛹,地道東北人醇疼。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像法焰,于是被迫代替她去往敵國和親秧荆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內容