簡(jiǎn)單實(shí)現(xiàn)MJExtension(二) -- 字典數(shù)組轉(zhuǎn)模型,替換

簡(jiǎn)單實(shí)現(xiàn)MJExtension(一) -- 字典轉(zhuǎn)模型

三、字典數(shù)組 to 模型

#pragma mark - 復(fù)雜字典 轉(zhuǎn) 模型
- (void)keyValuesArrayToObject {

    // 1.定義一個(gè)字典數(shù)組
    NSArray *dictArray = @[
                           @{
                               @"name" : @"Jack",
                               @"icon" : @"lufy.png",
                               },

                           @{
                               @"name" : @"Rose",
                               @"icon" : @"nami.png",
                               }
                           ];
}

在 NSObject+Extension.m 文件中添加方法+ objectArrayFromKeyValuesArray:

+ (NSMutableArray *)objectArrayFromKeyValuesArray:(NSArray *)keyValuesArray {

    // 1.創(chuàng)建數(shù)組
    NSMutableArray *modelArray = [NSMutableArray array];

    // 2.遍歷傳進(jìn)來(lái)的字典數(shù)組
    for (NSDictionary *keyValues in keyValuesArray) {
        if ([keyValues isKindOfClass:[NSArray class]]) {

            [modelArray addObject:[self objectArrayFromKeyValuesArray:(NSArray *)keyValues]];
        }
        else {
            id model = [self objectFromKeyValue:keyValues];
            if (model) {
                [modelArray addObject:model];
            }
        }
    }
    return modelArray;
}

回到ViewController 在字典數(shù)組下面

NSArray *modelArr = [YLUserModel objectArrayFromKeyValuesArray:dictArray];

    for (YLUserModel *user in modelArr) {
        NSLog(@"name = %@",user.name);
    }
字典數(shù)組 to 模型 的輸出.png

四、用自定義的屬性名接收key

#pragma mark - 用自定義的屬性名接收key
- (void)keyValuesArrayToObjectReplace {

    // 1.定義一個(gè)字典
    NSDictionary *dict = @{
                           @"id" : @"20",
                           @"desciption" : @"好孩子",
                           @"name" : @"Jack",
                           };
}
// 在模型里實(shí)現(xiàn)協(xié)議
+ (NSDictionary *)replacedKeyFromPropertyName {

    return @{
             @"ID" : @"id",
             @"desc" : @"desciption"
             };
}

修改 + objectFromKeyValue: 方法

+ (instancetype)objectFromKeyValue:(NSDictionary*)keyValue {

    id obj = [[self alloc]init];

    unsigned int count;

    // 獲取成員變量數(shù)組:注意:只會(huì)獲取當(dāng)前類的屬性,不會(huì)獲取父類
    Ivar *ivarList = class_copyIvarList(self, &count);

    // 遍歷
    for (int i = 0; i < count; i++) {
        Ivar ivar = ivarList[i];
        // 獲取成員變量名字
        NSString *ivarName = [NSString stringWithUTF8String:ivar_getName(ivar)];
        //NSLog(@"ivarName = %@",ivarName);//_age _name _icon _height _money

        // 截取 - 獲得模型的屬性名
        NSString *modelProperty = [ivarName substringFromIndex:1];
        //NSLog(@"modelProperty = %@",key);//age name icon height money

        NSString *keyBeReplaced; // 判斷是否要被替換 不判斷會(huì)死
        if ([self respondsToSelector:@selector(replacedKeyFromPropertyName)]) {
            keyBeReplaced = [self replacedKeyFromPropertyName][modelProperty];
        }

        // 獲取字典里的值 (判斷是否是被替換的)
        id value;
        if (keyBeReplaced) {

            value = keyValue[keyBeReplaced];
        }
        else{

            value = keyValue[modelProperty];
        }

        // 復(fù)雜字典,里面還有字典
        // 所以要獲取成員變量的類型
        NSString *ivarType = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];
        // @\"YLUserModel\" 需要截取 ,否則下面的 secIvarClass 是不存在的(這里要好好看下MJExtension,這個(gè)解決方式比較low)
        ivarType = [ivarType stringByReplacingOccurrencesOfString:@"@" withString:@""];
        ivarType = [ivarType stringByReplacingOccurrencesOfString:@"\"" withString:@""];
        //NSLog(@"ivarType = %@",ivarType);
        if ([value isKindOfClass:[NSDictionary class]] && ![ivarType hasPrefix:@"NS"]) {

            Class secIvarClass = NSClassFromString(ivarType);
            value = [secIvarClass objectFromKeyValue:value];
            NSLog(@"");
        }

        // 賦值
        [obj setValue:value forKey:modelProperty];
    }

    return obj;
}

回到ViewController 在字典下面

    YLUserModel *user = [YLUserModel objectFromKeyValue:dict];

    NSLog(@"name = %@,ID = %@,desc = %@",user.name,user.ID,user.desc);
用自定義的屬性名接收key 的輸出.png

今天到此結(jié)束,下次的是字典里有數(shù)組,數(shù)組里又有字典的情況

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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