前言 : 泛型的概念
1.泛型是Java中的一個(gè)重要特性,使用泛型編程可以使代碼獲得最大的重要痛阻。
2.在使用泛型時(shí)要指明泛型的具體類型菌瘪,這樣可以避免類型轉(zhuǎn)換。
3.泛型類是一個(gè)參數(shù)類型可變的類阱当;固泛型參數(shù)只能是類類型俏扩。
需要工具:
YYModel
鏈接 (可以使用pod請(qǐng)求)
Demo
鏈接 (github地址,喜歡的加個(gè)星謝謝)
使用截圖:
Model使用效果圖.png
其中需要注意的是:
- BaseModel并不是Model的
基類
弊添,他用來存儲(chǔ)一些所有Model中通用的部分 -- 在我們的項(xiàng)目中所有的Model都需要有(message , success , data)屬性录淡,所以我們將其放置在BaseModel中。 - <TestModel *>是類似java中泛型的概念油坝,在我們的測(cè)試?yán)又衐ata的數(shù)據(jù)類型是可變的嫉戚,使用<T>的方式能夠使
編譯器
識(shí)別data的類型,從而達(dá)到使用點(diǎn)語法的目的--(model.data.name) * name是TestModel的屬性 * - setDataClass的方式是為了讓BaseModel能夠真的跟TestModel關(guān)聯(lián)的方法澈圈,目的是能夠在
運(yùn)行時(shí)
保證data最終獲得的數(shù)據(jù)是我們需要的類型
實(shí)現(xiàn)原理
創(chuàng)建通用類(在本項(xiàng)目中為BaseModel)彬檀,并將常用不變屬性添加
在通用類中設(shè)置兩個(gè)靜態(tài)變量用于接受類名、類名數(shù)組 * 用于在[self setDataClass/setDataClassArr]的時(shí)候接收數(shù)據(jù) *
-
在通用類中導(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; }
-
實(shí)現(xiàn)傳遞Model類型的方法 -- Model類型數(shù)組的方法類似
- (void)setDataClass:(Class)class;
- (void)setDataClass:(Class)class
{
if (dataClass) {
dataClass = nil;
}
dataClass = class;
}
-
需要設(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