引述
對于每一個(gè)開發(fā)者來說,MVC對于我們來說在熟悉不過了熬拒,其中的M爷光,也就是所謂的Model,數(shù)據(jù)模型澎粟。如下圖所示:
我不知道在過往的開發(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類里面即可
字典轉(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噢寥闪!