iOS 字典转模型KVC实现

字典转模型 KVC 实现

KVC 字典转模型弊端:必须保证,模型中的属性和字典中的key一一对应。

如果不一致,就会调用[<Status 0x7fa74b545d60> setValue:forUndefinedKey:]报key找不到的错。

分析:模型中的属性和字典的key不一一对应,系统就会调用setValue:forUndefinedKey:报错。

解决:重写对象的setValue:forUndefinedKey:,把系统的方法覆盖,就能继续使用KVC,字典转模型了。

  一: 如果你不想用第三方控件,感觉自由度太低,比较受限制,那么可以尝试这种方法,使用 KVC 机制的 如下方法

- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;

二: 有的时候我们需要将字典里的数据类型转成我们模型需要的类型可以在-(void)setValue:(id)value forKey:(NSString *)key将value转换一下

// 将所有的Number数据类型转换为字符串

- (void) setValue:(id)value forKey:(NSString*)key{

if ([value isKindOfClass:[NSNull class]]) {

value=nil;

}elseif ([value isKindOfClass:[NSArrayclass]]) {

}else { 

value = [NSStringstringWithFormat:@"%@",value]; 

}

[supersetValue:value forKey:key];

}

// 对特殊字符 id 进行处理

- (void) setValue:(id)value forUndefinedKey:(NSString*)key {

NSLog(@"Undefined Key: %@", key); 

}

三: 如果我们还想要进行模型里的模型嵌套,或者模型里的模型数组或者其他处理怎么办?

在EmployeModel里面复写BaseModel里面的 setValueForKey比如我的EmployeModel里面还有个times 的字典数组,数组里面又是模型,单独处理。除此之外,我们还可以进行其他的一些数据微调处理。

-  (void) setValue:(id)value forKey:(NSString*)key {

if ([key isEqualToString:@"mobile"])  {

NSArray*arr = [(NSString*)value componentsSeparatedByString:@"-"];

value = [arr componentsJoinedByString:@""]; 

}elseif ([key isEqualToString:@"times"]) {

NSMutableArray*retArr = [NSMutableArrayarray];

for (int i =0; i < ((NSArray*)value).count; i++)  {

NSDictionary* aDayTimeDic  =  ((NSArray*)value)[i]; 

TimeModel *aDayTime = [[TimeModel alloc]initWithDic:aDayTimeDic];

[retArr addObject:aDayTime]; 

value = retArr; 

[supersetValue:value forKey:key]; 

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容