OC實(shí)現(xiàn)類似泛型效果的json數(shù)據(jù)解析

前言 : 泛型的概念

1.泛型是Java中的一個(gè)重要特性,使用泛型編程可以使代碼獲得最大的重要痛阻。 
2.在使用泛型時(shí)要指明泛型的具體類型菌瘪,這樣可以避免類型轉(zhuǎn)換。 
3.泛型類是一個(gè)參數(shù)類型可變的類阱当;固泛型參數(shù)只能是類類型俏扩。 

需要工具:

YYModel 鏈接 (可以使用pod請(qǐng)求)
Demo 鏈接 (github地址,喜歡的加個(gè)星謝謝)

使用截圖:

Model使用效果圖.png

其中需要注意的是:

  1. BaseModel并不是Model的基類弊添,他用來存儲(chǔ)一些所有Model中通用的部分 -- 在我們的項(xiàng)目中所有的Model都需要有(message , success , data)屬性录淡,所以我們將其放置在BaseModel中。
  2. <TestModel *>是類似java中泛型的概念油坝,在我們的測(cè)試?yán)又衐ata的數(shù)據(jù)類型是可變的嫉戚,使用<T>的方式能夠使編譯器識(shí)別data的類型,從而達(dá)到使用點(diǎn)語法的目的--(model.data.name) * name是TestModel的屬性 *
  3. setDataClass的方式是為了讓BaseModel能夠真的跟TestModel關(guān)聯(lián)的方法澈圈,目的是能夠在運(yùn)行時(shí)保證data最終獲得的數(shù)據(jù)是我們需要的類型

實(shí)現(xiàn)原理

  1. 創(chuàng)建通用類(在本項(xiàng)目中為BaseModel)彬檀,并將常用不變屬性添加

  2. 在通用類中設(shè)置兩個(gè)靜態(tài)變量用于接受類名、類名數(shù)組 * 用于在[self setDataClass/setDataClassArr]的時(shí)候接收數(shù)據(jù) *

  3. 在通用類中導(dǎo)入YYModel頭文件并使用
    // 當(dāng) JSON 轉(zhuǎn)為 Model 完成后瞬女,該方法會(huì)被調(diào)用凤覆。 // 你可以在這里對(duì)數(shù)據(jù)進(jìn)行校驗(yàn),如果校驗(yàn)不通過拆魏,可以返回 NO盯桦,則該 Model 會(huì)被忽略。 // 你也可以在這里做一些自動(dòng)轉(zhuǎn)換不能完成的工作渤刃。

    - (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {
      if (dataClass) {
     //如果聲明的是Class的話拥峦,使用YYModel將其轉(zhuǎn)化
     _data = [[dataClass class] yy_modelWithJSON:[dic valueForKey:@"data"]];
     //轉(zhuǎn)化后將常量置空以免發(fā)生錯(cuò)誤的轉(zhuǎn)化
     dataClass = nil;
              }
      //如果聲明的是數(shù)組的話判斷 -- 數(shù)組中都是相同的Model的時(shí)候直接轉(zhuǎn)化 數(shù)組中Model的類型不同的時(shí)候根據(jù)classArr中對(duì)應(yīng)的Class分別實(shí)現(xiàn)json->Model的轉(zhuǎn)化
      if (classArr) {
     NSMutableArray *array = [NSMutableArray array];
     NSArray *itemDicArr = [dic valueForKey:@"data"];
     
     if (classArr.count == 1) {
         
         for (NSInteger i = 0; i < itemDicArr.count; i++) {
             [array addObject:[(Class)classArr.firstObject yy_modelWithJSON:itemDicArr[i]]];
         }
     }else{
         
         for (NSInteger i = 0; i < itemDicArr.count; i++) {
             [array addObject:[(Class)classArr[i] yy_modelWithJSON:itemDicArr[i]]];
         }
     }
     _data = array;
     //轉(zhuǎn)化后將常量置空以免發(fā)生錯(cuò)誤的轉(zhuǎn)化
     classArr = nil;
     
     }
      return YES;
     }
    
  4. 實(shí)現(xiàn)傳遞Model類型的方法 -- Model類型數(shù)組的方法類似

    • (void)setDataClass:(Class)class;
    • (void)setDataClass:(Class)class
      {
      if (dataClass) {
      dataClass = nil;
      }
      dataClass = class;
      }
  5. 需要設(shè)計(jì)為泛型的屬性的設(shè)置

    • 需要注意的是使用<T>的作用是讓編譯器可以使用泛型的方式識(shí)別這個(gè)可變類型屬性(這里是data屬性)調(diào)用時(shí)的類型
    • 需要使用T來修飾可變類型的屬性
    • ** 使用retain修飾data是因?yàn)樗谶\(yùn)行時(shí)的真正類型(NSMutableArray / Model)都是需要retain修飾的 **
    • 最重要的一點(diǎn)是,泛型主要是起到能夠讓編譯器正確的識(shí)別類型的作用卖子,真正實(shí)現(xiàn)運(yùn)行時(shí)將json于Model對(duì)應(yīng)的是方法:modelCustomTransformFromDictionary:
通用類的.m文件.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末略号,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌玄柠,老刑警劉巖突梦,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異羽利,居然都是意外死亡宫患,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門这弧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娃闲,“玉大人,你說我怎么就攤上這事匾浪』拾铮” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵蛋辈,是天一觀的道長属拾。 經(jīng)常有香客問我,道長冷溶,這世上最難降的妖魔是什么捌年? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮挂洛,結(jié)果婚禮上礼预,老公的妹妹穿的比我還像新娘。我一直安慰自己虏劲,他們只是感情好托酸,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柒巫,像睡著了一般励堡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上堡掏,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天应结,我揣著相機(jī)與錄音,去河邊找鬼泉唁。 笑死鹅龄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的亭畜。 我是一名探鬼主播扮休,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼拴鸵!你這毒婦竟也來了玷坠?” 一聲冷哼從身側(cè)響起蜗搔,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎八堡,沒想到半個(gè)月后樟凄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兄渺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年缝龄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溶耘。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖服鹅,靈堂內(nèi)的尸體忽然破棺而出凳兵,到底是詐尸還是另有隱情,我是刑警寧澤企软,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布庐扫,位于F島的核電站,受9級(jí)特大地震影響仗哨,放射性物質(zhì)發(fā)生泄漏形庭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一厌漂、第九天 我趴在偏房一處隱蔽的房頂上張望萨醒。 院中可真熱鬧,春花似錦苇倡、人聲如沸富纸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晓褪。三九已至,卻和暖如春综慎,著一層夾襖步出監(jiān)牢的瞬間涣仿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工示惊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留好港,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓米罚,卻偏偏與公主長得像媚狰,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子阔拳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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

  • 概述 ? iOS源碼解析—YYModel(YYClassInfo)分析了如何根據(jù)OC的Class對(duì)象構(gòu)建...
    egoCogito_panf閱讀 11,602評(píng)論 4 32
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 11,002評(píng)論 6 13
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,264評(píng)論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理崭孤,服務(wù)發(fā)現(xiàn)类嗤,斷路器,智...
    卡卡羅2017閱讀 134,693評(píng)論 18 139
  • 快餐的社會(huì)里辨宠,很少有人愿意從你馬虎的外在遗锣,去發(fā)現(xiàn)你優(yōu)秀的內(nèi)在。so嗤形,我們內(nèi)外兼修精偿! 有的人,說出的每...
    不打雷的雷閱讀 310評(píng)論 0 1