導(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