使用runTime解析自己的第一字典

話不多說(shuō) 看代碼

#import <Foundation/Foundation.h>
@protocol NSObjectDelegate <NSObject>
// 提供一個(gè)協(xié)議,只要準(zhǔn)備這個(gè)協(xié)議的類(lèi),都能把數(shù)組中的字典轉(zhuǎn)模型
+ (NSDictionary *)arrayContainModelClass;
@end
@interface NSObject (Category)
+ (instancetype)initWithDict:(NSDictionary *)dict;
@end


//  NSObject+Category.m
//  RunTimeTest
//  Created by tuhaisheng on 17/3/7.
//  Copyright ? 2017年 tuhaisheng. All rights reserved.
#import "NSObject+Category.h"
#import "objc/runtime.h"
@implementation NSObject (Category)
+ (instancetype)initWithDict:(NSDictionary *)dict{
    id objc = [[self alloc] init];
    unsigned int count;
    //獲取類(lèi)中的所有成員屬性
    Ivar * ivarList = class_copyIvarList(self, &count);
    for (int i = 0; i < count; i++) {
        Ivar ivar = ivarList[i];
    //獲取成員屬性名
        NSString * name = [NSString stringWithUTF8String:ivar_getName(ivar)];
        NSLog(@"===name===%@=====",name);
        NSString * key = [name substringFromIndex:1];
        id value = dict[key];
        //value 是否是字典
        if ([value isKindOfClass:[NSDictionary class]]) {
            //獲取成員屬性類(lèi)型
            NSString * type = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];
            NSRange range = [type rangeOfString:@"\""];
            type = [type substringFromIndex:range.location + range.length];
            range = [type rangeOfString:@"\""];
            // 裁剪到哪個(gè)角標(biāo),不包括當(dāng)前角標(biāo)
            type = [type substringToIndex:range.location];
            
            // 根據(jù)字符串類(lèi)名生成類(lèi)對(duì)象
            Class modelClass = NSClassFromString(type);
            if (modelClass) {
                value = [modelClass initWithDict:value];
            }
        }
        
        if ([value isKindOfClass:[NSArray class]]) {
            if ([self respondsToSelector:@selector(arrayContainModelClass)]) {
                //
                id idSelf = self;
                NSString *type = [idSelf arrayContainModelClass][key];
                // 生成模型
                Class classModel = NSClassFromString(type);
                NSMutableArray *arrM = [NSMutableArray array];
                // 遍歷字典數(shù)組,生成模型數(shù)組
                for (NSDictionary *dict in value) {
                    // 字典轉(zhuǎn)模型
                    id model =  [classModel initWithDict:dict];
                    [arrM addObject:model];
                }
                // 把模型數(shù)組賦值給value
                value = arrM;
            }
        }
        if (value) { // 有值,才需要給模型的屬性賦值
            // 利用KVC給模型中的屬性賦值
            [objc setValue:value forKey:key];
        }
    }
    return objc;
}
@end
不管是字典里面包含數(shù)組還是字典,都會(huì)以 [objc setValue:value forKey:key];來(lái)執(zhí)行。
arrayContainModelClass 這個(gè)是一個(gè)協(xié)議,只要準(zhǔn)備這個(gè)協(xié)議的類(lèi),都能把數(shù)組中的字典轉(zhuǎn)模型
+ (NSDictionary *)arrayContainModelClass{
    return @{@"person":@"Person"};
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容