将字典转化为模型,面向模型开发,是在开发中最为常用的功能。利用KVC可以将字典转换为模型,但是前提有三个约束,一个是必须保证模型的属性个数大于等于字典个数,二是属性名称与字典的key必须相同,三是对于模型中的基本数据类型无法转换。
其中第一条与第三条,是其最大的弊端。例如,如果从服务器获取的数据字典,并不想使用所有的键值对。但是在开发中还是必须得全部将对应属性列出,全部进行转换(除非你一个一个写,不使用KVC)。
下面的代码就可以解决上述问题:实现以模型为主,将字典数据进行部分转化,并识别基本数据类型。约束仅仅是要求模型属性名称与字典KEY保持一致(因为底层还是使用KVC);
1//2//NSObject+Value.m3//4//Created by shunzi 5-10-2014.5//Copyright (c) 2014年 shunzi. All rights reserved.6//78#import"NSObject+Value.h"9#import<objc/message.h>10#import<objc/runtime.h>1112@implementationNSObject (Value)13- (void)setValues:(NSDictionary *)values14{15Class c = [selfclass];1617while(c) {18//1.获得所有的成员变量19unsignedintoutCount =0;20Ivar *ivars = class_copyIvarList(c, &outCount);2122for(inti =0; i<outCount; i++) {23Ivar ivar =ivars[i];2425//2.属性名26NSMutableString *name =[NSMutableString stringWithUTF8String:ivar_getName(ivar)];2728//删除最前面的_29[name replaceCharactersInRange:NSMakeRange(0,1) withString:@""];3031//3.取出属性值32NSString *key =name;33if([key isEqualToString:@"desc"]) {34key =@"description";35}36if([key isEqualToString:@"ID"]) {37key =@"id";38}39idvalue =values[key];40if(!value)continue;4142//4.SEL43//首字母44NSString *cap = [name substringToIndex:1];45//变大写46cap =cap.uppercaseString;47//将大写字母调换掉原首字母48[name replaceCharactersInRange:NSMakeRange(0,1) withString:cap];49//拼接set50[name insertString:@"set"atIndex:0];51//拼接冒号:52[name appendString:@":"];53SEL selector =NSSelectorFromString(name);5455//5.属性类型56NSString *type =[NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];5758if([type hasprefix:@"@"]) {//对象类型59objc_msgSend(self, selector, value);60}else{//非对象类型61if([type isEqualToString:@"d"]) {62objc_msgSend(self, selector, [value doubleValue]);63}elseif([type isEqualToString:@"f"]) {64objc_msgSend(self, selector, [value floatValue]);65}elseif([type isEqualToString:@"i"]) {66objc_msgSend(self, selector, [value intValue]);67}else{68objc_msgSend(self, selector, [value longLongValue]);69}70}71}7273c =class_getSuperclass(c);74}75}76@end
头文件仅仅包含对此方法的声明,所以不在此粘贴