Runtime實現(xiàn)字典轉(zhuǎn)模型

導(dǎo)言:開發(fā)過程中可能需要根據(jù)字典(NSDictionary)轉(zhuǎn)換成模型(Model),而Model一般都是用戶自定義的類繼承自NSObject,所以可以對NSObject新建一個分類(Category)。

分析:一般Model可能有多個存儲屬性,而字典中存儲的也是多個鍵值對key-value),所以需要對遍歷Model的屬性,然后比對字典中的key,如果key和屬性的名稱相同,則通過KVC的方式將該value賦值給該屬性。遍歷Model的屬性數(shù)組,就可以使用Runtime的方式取出該類的屬性。

代碼:

  • .h文件
#import <Foundation/Foundation.h>

@interface NSObject (LSHExtension)

/**
 字典轉(zhuǎn)模型

 @param dic 字典
 @return instancetype
 */
+ (instancetype)objWithDic:(NSDictionary *)dic;

@end
  • .m文件
#import "NSObject+LSHExtension.h"
#import <objc/runtime.h>

@implementation NSObject (LSHExtension)

+ (instancetype)objWithDic:(NSDictionary *)dic {
   
    id object = [[self alloc] init];
    
    NSArray *propertyList = [self getProperties];
    
    //遍歷字典的所有的key
    [dic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        //屬性中有該字典中的key,才可以賦值
        if ([propertyList containsObject:key]) {
            [object setValue:obj forKey:key];
        }
    }];
    
    return object;
}


+ (NSArray *)getProperties {
    //存儲所有的property的名稱
    NSMutableArray *propertyNames = [NSMutableArray array];
    //屬性個數(shù)
    unsigned int count = 0;
    //通過Runtime獲取當前類的所有屬性
    objc_property_t *properties = class_copyPropertyList([self class], &count);
    //遍歷所有的屬性,獲取所有的屬性名稱
    for (int i = 0; i < count; i ++) {
        
        objc_property_t property = properties[i];
        
        const char * propertyName = property_getName(property);
        
        [propertyNames addObject:[NSString stringWithUTF8String:propertyName]];
    }
    //釋放
    free(properties);
    return propertyNames;
}

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

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