MJExtension是一个高效率的将字典转换成模型的三方框架,当然这里也可将包括模型转字典;
同时,内部也有将CoreData和归档产生的文件转换成模型;
作者水平有限,这里仅从最简单的字典转模型讨论;
1、根据MJ提供的示例剖析内部的结构,看代码:
// 1.定义一个字典
NSDictionary *dict = @{
@"name" : @"Jack",
@"icon" : @"lufy.png",
@"age" : @20,
@"height" : @1.55,
@"money" : @"100.9",
@"sex" : @(SexFemale),
// @"gay" : @"1"
// @"gay" : @"NO"
@"gay" : @"true"
};
// 2.将字典转为User模型
User *user = [User objectWithKeyValues:dict];
// 3.打印User模型的属性
NSLog(@"name=%@, icon=%@, age=%d, height=%@, money=%@, sex=%d, gay=%d", user.name, user.icon, user.age, user.height, user.money, user.sex, user.gay);
MJExtension提供NSObject的类方法,模型可直接调用objectWithKeyValues方法,内部根据模型的属性直接将字典转化成模型,这里模型的名称必须要和字典中key的名称保持一致;
2、按住command点击左键,一路看到很多函数的调用,其中这里比较难理解:
- (instancetype)setKeyValues:(id)keyValues context:(NSManagedObjectContext *)context error:(NSError *__autoreleasing *)error
{
// 如果是JSON字符串
if ([keyValues isKindOfClass:[NSString class]]) {
keyValues = [((NSString *)keyValues) JSONObject];
}
MJAssertError([keyValues isKindOfClass:[NSDictionary class]], self, error, @"keyValues参数不是一个字典");
@try {
//获取该对象的所有属性 ???
NSArray *ignoredPropertyNames = [[self class] totalIgnoredPropertyNames];
MJLog(@"ignoredPropertyNames->%@",ignoredPropertyNames);
[[self class] enumeratePropertiesWithBlock:^(MJProperty *property, BOOL *stop) {
// 0.检测是否被忽略
if ([ignoredPropertyNames containsObject:property.name]) return;
// 1.取出属性值
id value = keyValues ;
NSArray *keys = [property keysFromClass:[self class]];
for (NSString *key in keys) {
if (![value isKindOfClass:[NSDictionary class]]) continue;
value = value[key];
}
if (!value || value == [NSNull null]) return;
// 2.如果是模型属性
MJType *type = property.type;
Class typeClass = type.typeClass;
Class objectCla