在之前的某个项目中,字典转模型时同时使用关键字替代方法和驼峰法,即:
id关键字替代
+(NSDictionary*)mj_replacedKeyFromPropertyName{
return @{@"ID":@"id"};
}
驼峰法
+ (NSString *)mj_replacedKeyFromPropertyName121:(NSString *)propertyName{
return [propertyName mj_underlineFromCamel];
}
在使用过程中发现关键字替代方法无效,即使用ID无法获取解析数据,如下图:
在gitHub上查看issue时发现也有很多人遇到这样的问题,也都在询问解决方法和原因。后来又仔细翻看了Closed issue,发现里面有相关描述。
原因分析
mj_replacedKeyFromPropertyName121
方法优先级比mj_underlineFromCamel
方法高,key在执行mj_replacedKeyFromPropertyName121
方法的时候已经经过mj_underlineFromCamel
方法返回具体值,不会再执行mj_replacedKeyFromPropertyName
方法。可将mj_replacedKeyFromPropertyName
的内容合并在mj_replacedKeyFromPropertyName121
方法里。
解决方案
+ (NSString *)mj_replacedKeyFromPropertyName121:(NSString *)propertyName{
//解决关键字冲突
if ([propertyName isEqualToString:@"ID"]) return @"id";
return [propertyName mj_underlineFromCamel];
}
或者在mj_replacedKeyFromPropertyName121
方法里对关键字不做处理,即返回nil,然后再在mj_replacedKeyFromPropertyName
使用ID替换关键字id,不过个人觉得有点多此一举,不如上述方法。
+(NSDictionary*)mj_replacedKeyFromPropertyName{
return @{@"ID":@"id"};
}
+ (NSString *)mj_replacedKeyFromPropertyName121:(NSString *)propertyName{
if ([propertyName isEqualToString:@"ID"]) return nil;//对关键字不作处理
return [propertyName mj_underlineFromCamel];
}
自此困扰很久的一个问题完美地得到解决!