【iOS分享之路-快速上手Runtime】五璧尸、字典轉(zhuǎn)模型(一級轉(zhuǎn)換)

duwenquan-方形LOGO.png

引述

對于每一個(gè)開發(fā)者來說,MVC對于我們來說在熟悉不過了熬拒,其中的M爷光,也就是所謂的Model,數(shù)據(jù)模型澎粟。如下圖所示:

Model.png

我不知道在過往的開發(fā)中蛀序,大家是怎么創(chuàng)建模型的。如果一個(gè)模型中只有簡單的幾個(gè)活烙,通常我們手打敲上這些屬性就可以了徐裸,但是如果是幾十個(gè)呢?難道還要用手敲啸盏,或者一個(gè)個(gè)的復(fù)制黏貼嗎重贺?在介紹RUntime字典轉(zhuǎn)模型之前,先給大家介紹下一個(gè)工具回懦,自動創(chuàng)建模型檬姥。當(dāng)然。粉怕。健民。這工具不是自動給你的模型創(chuàng)建代碼,還是需要你復(fù)制黏貼的贫贝,不過只需要復(fù)制一次秉犹,黏貼一次。

NSObject+autoGenerateProperty

很明顯稚晚,這是一個(gè)NSObject的分類崇堵,具體實(shí)現(xiàn)原理是:

  • 1.聲明并實(shí)現(xiàn)一個(gè)方法,傳入一個(gè)字典
+ (void)createPropertyCodeWithDict:(NSDictionary *)dict;

  • 2.具體實(shí)現(xiàn)的原理
    1.先查看共有部分客燕,然后共有部分的其中一些變量由字典的什么決定的

2.assign鸳劳,strong,等是由變量的類型決定的也搓,那么可以通過value類型來確定

value isKindOfClass:NSClassFromString(@"__NSCFString")

3.屬性名就是遍歷字典中給的key

[dict enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull propertyName, id  _Nonnull value, BOOL * _Nonnull stop) 

propertyName就是key

4.然后在打印控制臺復(fù)制代碼黏貼到Model類里面即可

屬性.png

字典轉(zhuǎn)模型

字典轉(zhuǎn)模型的方法赏廓,通常一般情況下可以使用KVC,但是KVC字典轉(zhuǎn)模型有個(gè)不好的地方傍妒,那就是必須保證:

  • a.模型中的屬性和字典中的key一一對應(yīng)幔摸。
  • b.如果不一致,就會調(diào)用[<Status 0x7fa74b545d60> setValue:forUndefinedKey:] 報(bào)key找不到的錯(cuò)颤练。
    分析:模型中的屬性和字典的key不一一對應(yīng)既忆,系統(tǒng)就會調(diào)用setValue:forUndefinedKey:報(bào)錯(cuò)。
  • c.解決:重寫對象的setValue:forUndefinedKey:,把系統(tǒng)的方法覆蓋, 就能繼續(xù)使用KVC患雇,字典轉(zhuǎn)模型了跃脊。

Runtime字典轉(zhuǎn)模型

思路:利用運(yùn)行時(shí),遍歷模型中所有屬性苛吱,根據(jù)模型的屬性名匾乓,去字典中查找key,取出對應(yīng)的值又谋,給模型的屬性賦值拼缝。
步驟:提供一個(gè)NSObject分類,專門字典轉(zhuǎn)模型彰亥,以后所有模型都可以通過這個(gè)分類轉(zhuǎn)咧七。
具體步驟如下:

  • 1.創(chuàng)建一個(gè)分類,聲明并實(shí)現(xiàn)一個(gè)方法任斋,傳入一個(gè)字典
+ (instancetype)modelWithDict:(NSDictionary *)dict;
  • 2.創(chuàng)建對應(yīng)類的對象

  • 3.遍歷模型中所有成員變量屬性

  • 4.獲取成員屬性继阻,成員名,成員屬性類型废酷,獲取key瘟檩,獲取字典的value

  • 5.KVC賦值 具體事例如下代碼:

 unsigned int count = 0;
    Ivar *ivarList = class_copyIvarList(self, &count);
    for (int i = 0 ; i < count; i++) {
        // 獲取成員屬性
        Ivar ivar = ivarList[i];
        
        // 獲取成員名
       NSString *propertyName = [NSString stringWithUTF8String:ivar_getName(ivar)];
        ;
        // 成員屬性類型
        NSString *propertyType = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];

        // 獲取key
        NSString *key = [propertyName substringFromIndex:1];
        
        // 獲取字典的value
        id value = dict[key];
        // 給模型的屬性賦值
        // value:字典的值
        // key:屬性名
        
        if (value) {
            // KVC賦值:不能傳空
            [objc setValue:value forKey:key];
            
        }
//        NSLog(@"%@",key);
//        NSLog(@"%@ %@",propertyType , propertyName);
    }

    return objc;
  • 注意:

ivar:成員屬性
class_copyIvarList:把成員屬性列表復(fù)制一份給你
Ivar *:指向Ivar指針
Ivar *:指向一個(gè)成員變量數(shù)組
class:獲取哪個(gè)類的成員屬性列表
count:成員屬性總數(shù)

查看是否利用runtime轉(zhuǎn)模型成功

打斷點(diǎn),進(jìn)行查看澈蟆,或者獲取數(shù)組其中一個(gè)墨辛,輸出打印。

Demo下載地址

Runtime字典轉(zhuǎn)模型
廣大書友感覺不錯(cuò)趴俘,給個(gè)關(guān)注睹簇,喜歡,在GitHub上給個(gè)Star噢寥闪!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末太惠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子疲憋,更是在濱河造成了極大的恐慌凿渊,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缚柳,死亡現(xiàn)場離奇詭異埃脏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)喂击,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門剂癌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淤翔,“玉大人翰绊,你說我怎么就攤上這事。” “怎么了监嗜?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵谐檀,是天一觀的道長。 經(jīng)常有香客問我裁奇,道長桐猬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任刽肠,我火速辦了婚禮溃肪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘音五。我一直安慰自己惫撰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布躺涝。 她就那樣靜靜地躺著厨钻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坚嗜。 梳的紋絲不亂的頭發(fā)上夯膀,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音苍蔬,去河邊找鬼诱建。 笑死环形,一個(gè)胖子當(dāng)著我的面吹牛胁塞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灵莲,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蜈敢,長吁一口氣:“原來是場噩夢啊……” “哼辜荠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抓狭,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤伯病,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后否过,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體午笛,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年苗桂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了药磺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡煤伟,死狀恐怖癌佩,靈堂內(nèi)的尸體忽然破棺而出木缝,到底是詐尸還是另有隱情,我是刑警寧澤围辙,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布我碟,位于F島的核電站,受9級特大地震影響姚建,放射性物質(zhì)發(fā)生泄漏矫俺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一掸冤、第九天 我趴在偏房一處隱蔽的房頂上張望厘托。 院中可真熱鬧,春花似錦稿湿、人聲如沸催烘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伊群。三九已至,卻和暖如春策精,著一層夾襖步出監(jiān)牢的瞬間舰始,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工咽袜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丸卷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓询刹,卻偏偏與公主長得像谜嫉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子凹联,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

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