導(dǎo)言:開發(fā)過程中可能需要根據(jù)字典(NSDictionary
)轉(zhuǎn)換成模型(Model
)怔檩,而Model
一般都是用戶自定義的類繼承自NSObject
坚俗,所以可以對(duì)NSObject新建一個(gè)分類(Category
)彬檀。
分析:一般Model
可能有多個(gè)存儲(chǔ)屬性甘萧,而字典中存儲(chǔ)的也是多個(gè)鍵值對(duì)
(key-value
)彩匕,所以需要對(duì)遍歷Model
的屬性柴我,然后比對(duì)字典中的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 {
//存儲(chǔ)所有的property的名稱
NSMutableArray *propertyNames = [NSMutableArray array];
//屬性個(gè)數(shù)
unsigned int count = 0;
//通過Runtime獲取當(dāng)前類的所有屬性
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