runtime:字典轉(zhuǎn)模型的應(yīng)用

字典轉(zhuǎn)模型一般都兩種方式,1、圖方便用的mj框架;2、自己在模型中寫(xiě)類(lèi)方法,用KVC實(shí)現(xiàn)。

換換口味,嘗試下runtime,如果想僅僅實(shí)現(xiàn)自己需要的功能其實(shí)很簡(jiǎn)單,就那幾個(gè)C語(yǔ)言函數(shù)

實(shí)現(xiàn)兩級(jí)嵌套字典的轉(zhuǎn)換:
#import <objc/message.h>

  @implementation NSObject (Model)

  + (instancetype)modelWithDict:(NSDictionary *)dict{
  // 1.創(chuàng)建對(duì)應(yīng)類(lèi)的對(duì)象
  id objc = [[self alloc] init];

// runtime:遍歷模型中所有成員屬性,去字典中查找
// 屬性定義在哪,定義在類(lèi),類(lèi)里面有個(gè)屬性列表(數(shù)組)
    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)];
    // 獲取key(默認(rèn)是以下劃線開(kāi)頭的變量)
    NSString *key = [propertyName substringFromIndex:1];
    // 成員屬性類(lèi)型
    NSString *propertyType = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];
    // user:NSDictionary
    // 二級(jí)轉(zhuǎn)換
    // 值是字典,成員屬性的類(lèi)型不是字典,才需要轉(zhuǎn)換成模型
    if ([value isKindOfClass:[NSDictionary class]] && ![propertyType containsString:@"NS"]) { // 需要字典轉(zhuǎn)換成模型
        // 轉(zhuǎn)換成哪個(gè)類(lèi)型(轉(zhuǎn)移符)
        NSRange range = [propertyType rangeOfString:@"\""];
        propertyType = [propertyType substringFromIndex:range.location + range.length];
        range = [propertyType rangeOfString:@"\""];
        propertyType = [propertyType substringToIndex:range.location];

        // 獲取需要轉(zhuǎn)換類(lèi)的類(lèi)對(duì)象
        Class modelClass =  NSClassFromString(propertyType);
        if (modelClass) {
            value =  [modelClass modelWithDict:value];
        }
    }
    if (value) {
        // KVC賦值:不能傳空
        [objc setValue:value forKey:key];   
    }
}
return objc;

}
主要是 獲取對(duì)象的屬性列表: class_copyIvarList ,C語(yǔ)言字符串轉(zhuǎn)OC: ivar_getName,再通過(guò)操作字符串,最后賦值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容