runtime可以做很多事情核无,這里不一一列舉吱型。很多三方庫(kù)都是通過(guò)runtime來(lái)完成字典轉(zhuǎn)模型大體思路如下:
1. 遍歷模型中的屬性,然后拿到屬性名作為鍵值去字典中尋找值.
2. 找到值后根據(jù)模型的屬性的類型將值轉(zhuǎn)成正確的類型
3.利用kvc完成屬性的賦值
第一步:遍歷模型中的屬性,然后拿到屬性名作為鍵值去字典中尋找值
我們可以通過(guò)一個(gè)分類來(lái)獲取所有屬性
上面這些類型,是類型編碼,在蘋果文檔中告訴了我們編碼對(duì)應(yīng)的類型:
根據(jù)圖表,我們將常用的幾個(gè)編碼定義成常量字符串或者宏表示它所對(duì)應(yīng)的類型
設(shè)置屬性類型type
然后進(jìn)行下一步----2.用該屬性名作為鍵去字典中尋找對(duì)應(yīng)的值.
id value = [keyValues valueForKey:property.name];
if(!value)continue;
接下來(lái)是第三步:3.拿到值后將值的類型轉(zhuǎn)換為屬性對(duì)應(yīng)的數(shù)據(jù)類型.
if(type.isNumberType){ if([valueisKindOfClass:[NSStringclass]])value= [[[NSNumberFormatter alloc]init] numberFromString:value];}
其中有一種情況,是需要進(jìn)行特殊處理的.當(dāng)模型的屬性是char類型或者bool類型時(shí),獲取到的編碼都為c,并且bool還有可能是B編碼,它們都對(duì)應(yīng)_boolType.因?yàn)閿?shù)字類型包含布爾類型,所以bool類型要在數(shù)字類型的條件下進(jìn)行額外判斷.
if(type.isNumberType){? ? ? ? ? ? NSString *oldValue = value;// 字符串->數(shù)字if([valueisKindOfClass:[NSStringclass]]){value = [[[NSNumberFormatter alloc] init]numberFromString:value];if(type.isBoolType) {? ? ? ? ? ? ? ? ? ? NSString *lower = [oldValue lowercaseString];if([lowerisEqualToString:@"yes"] || [lowerisEqualToString:@"true"] ) {? ? ? ? ? ? ? ? ? ? ? ? value =@YES;? ? ? ? ? ? ? ? ? ? }elseif([lowerisEqualToString:@"no"] || [lowerisEqualToString:@"false"]) {? ? ? ? ? ? ? ? ? ? ? ? value =@NO;? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? }? ? ? ? ? ? }? ? ? ? }
然后處理其他類型轉(zhuǎn)成字符串類型的情況.
else{if(typeClass == [NSStringclass]) {if([valueisKindOfClass:[NSNumberclass]]) {if(type.isNumberType)// NSNumber -> NSStringvalue= [valuedescription];? ? ? ? ? ? ? ? }elseif([valueisKindOfClass:[NSURLclass]]){// NSURL -> NSStringvalue= [valueabsoluteString];? ? ? ? ? ? ? ? }? ? ? ? ? ? }? ? ? ? }
KVC賦值
[self setValue:value forKey:property.name];