将字典转化为模型,面向模型开发,是在开发中最为常用的功能。利用KVC可以将字典转换为模型,但是前提有三个约束,一个是必须保证模型的属性个数大于等于字典个数,二是属性名称与字典的key必须相同,三是对于模型中的基本数据类型无法转换。

  其中第一条与第三条,是其最大的弊端。例如,如果从服务器获取的数据字典,并不想使用所有的键值对。但是在开发中还是必须得全部将对应属性列出,全部进行转换(除非你一个一个写,不使用KVC)。

  下面的代码就可以解决上述问题:实现以模型为主,将字典数据进行部分转化,并识别基本数据类型。约束仅仅是要求模型属性名称与字典KEY保持一致(因为底层还是使用KVC);

 //
// NSObject+Value.m
//
// Created by shunzi 5-10-2014.
// Copyright (c) 2014年 shunzi. All rights reserved.
// #import "NSObject+Value.h"
#import <objc/message.h>
#import <objc/runtime.h> @implementation NSObject (Value)
- (void)setValues:(NSDictionary *)values
{
Class c = [self class]; while (c) {
// 1.获得所有的成员变量
unsigned int outCount = ;
Ivar *ivars = class_copyIvarList(c, &outCount); for (int i = ; i<outCount; i++) {
Ivar ivar = ivars[i]; // 2.属性名
NSMutableString *name = [NSMutableString stringWithUTF8String:ivar_getName(ivar)]; // 删除最前面的_
[name replaceCharactersInRange:NSMakeRange(, ) withString:@""]; // 3.取出属性值
NSString *key = name;
if ([key isEqualToString:@"desc"]) {
key = @"description";
}
if ([key isEqualToString:@"ID"]) {
key = @"id";
}
id value = values[key];
if (!value) continue; // 4.SEL
// 首字母
NSString *cap = [name substringToIndex:];
// 变大写
cap = cap.uppercaseString;
// 将大写字母调换掉原首字母
[name replaceCharactersInRange:NSMakeRange(, ) withString:cap];
// 拼接set
[name insertString:@"set" atIndex:];
// 拼接冒号:
[name appendString:@":"];
SEL selector = NSSelectorFromString(name); // 5.属性类型
NSString *type = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)]; if ([type hasPrefix:@"@"]) { // 对象类型
objc_msgSend(self, selector, value);
} else { // 非对象类型
if ([type isEqualToString:@"d"]) {
objc_msgSend(self, selector, [value doubleValue]);
} else if ([type isEqualToString:@"f"]) {
objc_msgSend(self, selector, [value floatValue]);
} else if ([type isEqualToString:@"i"]) {
objc_msgSend(self, selector, [value intValue]);
} else {
objc_msgSend(self, selector, [value longLongValue]);
}
}
} c = class_getSuperclass(c);
}
}
@end

头文件仅仅包含对此方法的声明,所以不在此粘贴

最新文章

  1. Java实现多种方式的http数据抓取
  2. iOS开发之功能模块--计算高度Demo探究手稿
  3. python 学习 第一课
  4. Hibernate映射之OneToOne(第二篇)
  5. 纯css制作带三角border篇(兼容所有浏览器)
  6. C++ Primer与c++编程思想的比较(转)
  7. Net Core开源通讯组件 SmartRoute
  8. SGU 168.Matrix
  9. ASP.NET状缓存Cache的应用-提高数据库读取速度
  10. c++实现dll注入其它进程
  11. 用WIFI为什么连不上VPN
  12. 转: Nodejs 发送HTTP POST请求实例
  13. SQLSERVER 中实现类似Mysql的 INSERT ON DUPLICATE KEY UPDATE
  14. 【JS】JavaScript中的闭包
  15. 关于ios手机游览器针对overflow:hidden设置无效的解决办法
  16. window.load 和$(document).ready() 区别
  17. Linux c codeblock的使用(三):使用函数库
  18. C# 关于 DataTable 的一些使用
  19. 6.docker的私用镜像仓库registry
  20. 把一串数字表示成千位分隔形式——JS正则表达式的应用

热门文章

  1. Java编程思想学习(七) 抽象类和接口
  2. poj 3070 矩阵快速幂模板
  3. poj 3311 tsp入门
  4. IPC机制
  5. Tarjan算法详解理解集合
  6. 获取IplImage 数据并打印
  7. MySQL逻辑备份与恢复
  8. python + selenium + PhantomJS 获取腾讯应用宝APP评论
  9. mongo复习
  10. try、catch 和 throw 语句 (了解)