ios 怎么打印ios 对象类型转data的类型 转成字典

&>&iOS对象转字典 object2Dictionary
iOS对象转字典 object2Dictionary
上传大小:36KB
iOS对象转字典 object2Dictionary
从项目中提取出来的,对象转为字典,对象转为json;
综合评分:4.6(9位用户评分)
所需积分/C币:
下载个数:161
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var q = $("#form1").serializeArray();
console.log(q);
var res_area_r = $.trim($(".res_area_r").val());
if (res_area_r == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
var mess = $(".res_area_r").val();
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, _username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click",'.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
$(".res_area_r").val($.trim($(".res_area").val()));
评论共有5条
不错就是没注释
挺不错的,尝试了下,连自定义类中数组类型的属性也能转成Dictionary。
很不错,就是第一次用不知道为什么崩溃了》。。。。
不错就是没注释
挺不错的,尝试了下,连自定义类中数组类型的属性也能转成Dictionary。
审核通过送C币
Ray Wenderlich 书籍
创建者:fengqingli
iOS开发学习电子书
iOS电子图书大全
创建者:qq_
上传者其他资源上传者专辑
FFmpeg-iOS
Lame2Mp3 支持arm64、x86_64、armv7、armv7s、i386
iOS下拉刷新上拉加载更多-支持自定义加载head和foot
Mac上安装MySQL
mac上搭建openfre服务端
移动开发热门标签
VIP会员动态
下载频道积分规则调整V1710.18
CSDN下载频道积分调整公告V1710.17
开通VIP,海量IT资源任性下载
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
CSDN&VIP年卡&4000万程序员的必选
为了良好体验,不建议使用迅雷下载
iOS对象转字典 object2Dictionary
会员到期时间:
剩余下载个数:
剩余C币:593
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
(仅够下载10个资源)
全站300个资源免积分下载
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
全站300个资源免积分下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
全站300个资源免积分下载
为了良好体验,不建议使用迅雷下载
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
iOS对象转字典 object2Dictionary下次自动登录
现在的位置:
& 综合 & 正文
IOS_Struct结构体与NSObject对象的通用互转方法
这个应该是Struct结构体与NSObject对象的通用互转方法。以后再也不用担心类型转换的问题了。
本文来自【小编我】
仅仅是个例子,自己举一反三。
遇到一个问题,需要把某特殊类型的变量作为参数保存,或者传递。
如何将要MKCoordinateRegion 与 NSObject 互转,于是想,有没有什么方法可以将结构体都转换为NSObject对象。
所以google 得到以下结论:
MKCoordinateR// region to NSDataNSData *data = [NSData dataWithBytes:&region length:sizeof(region)];
// NSData to region[data getBytes:&region length:sizeof(region)];
同时还验证得到以下结论:
struct一声明就分配内存了。NSObject对象还要初始化才分配内存。
不要BS我的文章短小。。。
&&&&推荐文章:
【上篇】【下篇】福利-&KVC+Runtime获取类/对象的属性/成员变量/方法/协议并实现字典转模型
来源:博客园
我们知道,KVC+Runtime可以做非常多的事情。有了这个,我们可以实现很多的效果。这里来个福利,利用KVC+Runtime获取类/对象的所有成员变量、属性、方法及协议;并利用它来实现字典转模型。废话不多说,直接上代码:1、工具类(其实就是NSObject的一个分类)头文件 1 #import &Foundation/Foundation.h& 2
3 @interface NSObject (YSRuntime) 4
返回当前类的属性数组 7
@return 属性数组(如:"name","age","address") 9
*/<span style="color: # + (NSArray *)ys_propertiesL<span style="color: # <span style="color: # /**<span style="color: #
返回当前类的成员变量数组<span style="color: #
<span style="color: #
@return 成员变量数组<span style="color: #
*/<span style="color: # + (NSArray *)ys_ivarsL<span style="color: # <span style="color: # /**<span style="color: #
返回当前类的对象方法数组<span style="color: #
<span style="color: #
@return 方法数组<span style="color: #
*/<span style="color: # + (NSArray *)ys_methodL<span style="color: # <span style="color: # /**<span style="color: #
返回当前类的协议数组<span style="color: #
<span style="color: #
@return 协议数组<span style="color: #
*/<span style="color: # + (NSArray *)ys_protocolL<span style="color: # <span style="color: # /**<span style="color: #
使用字典创建当前类的对象<span style="color: #
<span style="color: #
@param dictionary 字典<span style="color: #
<span style="color: #
@return 当前类的对象<span style="color: #
*/<span style="color: # + (instancetype)ys_objectWithDictionary:(NSDictionary *)<span style="color: # <span style="color: # /**<span style="color: #
使用字典数组创建当前类的对象数组<span style="color: #
<span style="color: #
@param dictArray 字典数组<span style="color: #
<span style="color: #
@return 当前类的对象数组<span style="color: #
*/<span style="color: # + (NSArray *)ys_objectsWithDictionaryArray:(NSArray&NSDictionary *& *)dictA<span style="color: # <span style="color: # @end2、下面我们来实现里面的方法,以后就用它来获取类/对象的属性、成员变量、方法和协议
说明一下:最主要的方法是在objc/runtime.h,这里只是列举了一些,起到抛砖引玉的作用
1 #import "NSObject+YSRuntime.h"
2 #import &objc/runtime.h&
4 @implementation NSObject (YSRuntime)
6 #pragma mark - 属性数组
7 const char *propertiesKey = "ys.propertiesList";
8 + (NSArray *)ys_propertiesList {
// 获取关联对象 11
NSArray *result = objc_getAssociatedObject(self, propertiesKey); 12
if (result != nil) { 14
unsigned int count = <span style="color: #; 18
objc_property_t *list = class_copyPropertyList([self class], &count); 19
NSMutableArray *arrayM = [NSMutableArray array]; 21
for (unsigned int i = <span style="color: #; i & i++) { 23
objc_property_t pty = list[i]; 25
const char *cName = property_getName(pty); 27
NSString *name = [NSString stringWithUTF8String:cName]; 28
[arrayM addObject:name]; 30
free(list); 33
// 设置关联对象 35
objc_setAssociatedObject(self, propertiesKey, arrayM, OBJC_ASSOCIATION_COPY_NONATOMIC); 36
return objc_getAssociatedObject(self, propertiesKey); 38 } 39
40 #pragma mark - 私有方法,专门针对字典转模型中的自定义属性,{@"name":@"Dog"},name是属性名,Dog是自定义的模型类,属性名-属性类型 41 const char *propertiesTypeKey = "ys.propertiesTypeKey"; 42 + (NSArray&NSDictionary *& *)ys_propertiesAndTypeList { 43
// 获取关联对象 45
NSArray *result = objc_getAssociatedObject(self, propertiesTypeKey); 46
if (result != nil) { 48
unsigned int count = <span style="color: #; 52
objc_property_t *list = class_copyPropertyList([self class], &count); 53
NSMutableArray&NSDictionary *& *arrayM = [NSMutableArray&NSDictionary *& array]; 55
for (unsigned int i = <span style="color: #; i & i++) { 57
objc_property_t pty = list[i]; 59
const char *cType = property_getAttributes(pty); 61
NSString *typeStr = [NSString stringWithUTF8String:cType]; 62
if([typeStr containsString:@"\",&"]){ 64
NSRange typeRange = [typeStr rangeOfString:@"\",&"]; 65
NSString *type = [typeStr substringWithRange:NSMakeRange(<span style="color: #, typeRange.location - <span style="color: #)]; 66
const char *cName = property_getName(pty); 68
NSString *name = [NSString stringWithUTF8String:cName]; 69
NSDictionary *dict = @{name:type}; 71
[arrayM addObject:dict]; 73
free(list); 77
// 设置关联对象 79
objc_setAssociatedObject(self, propertiesTypeKey, arrayM, OBJC_ASSOCIATION_COPY_NONATOMIC); 80
return objc_getAssociatedObject(self, propertiesTypeKey); 82 } 83
85 #pragma mark - 成员变量数组 86 const char *ivarsKey = "ys.ivarsList"; 87 + (NSArray *)ys_ivarsList { 88
// 获取关联对象 90
NSArray *result = objc_getAssociatedObject(self, ivarsKey); 91
if (result != nil) { 93
unsigned int count = <span style="color: #; 97
Ivar *list = class_copyIvarList([self class], &count); 98
NSMutableArray *arrayM = [NSMutableArray array];<span style="color: #0
<span style="color: #1
for (unsigned int i = <span style="color: #; i & i++) {<span style="color: #2
<span style="color: #3
Ivar ivar = list[i];<span style="color: #4
<span style="color: #5
const char *cName = ivar_getName(ivar);<span style="color: #6
NSString *name = [NSString stringWithUTF8String:cName];<span style="color: #7
<span style="color: #8
[arrayM addObject:name];<span style="color: #9
}<span style="color: #0
<span style="color: #1
free(list);<span style="color: #2
<span style="color: #3
// 设置关联对象<span style="color: #4
objc_setAssociatedObject(self, ivarsKey, arrayM, OBJC_ASSOCIATION_COPY_NONATOMIC);<span style="color: #5
<span style="color: #6
return objc_getAssociatedObject(self, ivarsKey);<span style="color: #7 }<span style="color: #8 <span style="color: #9 #pragma mark - 方法数组<span style="color: #0 + (NSArray *)ys_methodList {<span style="color: #1
<span style="color: #2
unsigned int count = <span style="color: #;<span style="color: #3
Method *list = class_copyMethodList([self class], &count);<span style="color: #4
<span style="color: #5
NSMutableArray *arrayM = [NSMutableArray array];<span style="color: #6
<span style="color: #7
for (unsigned int i = <span style="color: #; i & i++) {<span style="color: #8
<span style="color: #9
Method method = list[i];<span style="color: #0
<span style="color: #1
SEL selector = method_getName(method);<span style="color: #2
NSString *name = NSStringFromSelector(selector);<span style="color: #3
<span style="color: #4
[arrayM addObject:name];<span style="color: #5
}<span style="color: #6
<span style="color: #7
free(list);<span style="color: #8
<span style="color: #9
return arrayM.<span style="color: #0 }<span style="color: #1 <span style="color: #2 #pragma mark - 协议数组<span style="color: #3 + (NSArray *)ys_protocolList {<span style="color: #4
<span style="color: #5
unsigned int count = <span style="color: #;<span style="color: #6
__unsafe_unretained Protocol **list = class_copyProtocolList([self class], &count);<span style="color: #7
<span style="color: #8
NSMutableArray *arrayM = [NSMutableArray array];<span style="color: #9
<span style="color: #0
for (unsigned int i = <span style="color: #; i & i++) {<span style="color: #1
<span style="color: #2
Protocol *protocol = list[i];<span style="color: #3
<span style="color: #4
const char *cName = protocol_getName(protocol);<span style="color: #5
NSString *name = [NSString stringWithUTF8String:cName];<span style="color: #6
<span style="color: #7
[arrayM addObject:name];<span style="color: #8
}<span style="color: #9
<span style="color: #0
free(list);<span style="color: #1
<span style="color: #2
return arrayM.<span style="color: #3 }<span style="color: #4 <span style="color: #5 #pragma mark - 字典 -& 当前类的对象<span style="color: #6 + (instancetype)ys_objectWithDictionary:(NSDictionary *)dictionary{<span style="color: #7
<span style="color: #8
// 当前类的属性数组<span style="color: #9
NSArray *list = [self ys_propertiesList];<span style="color: #0
<span style="color: #1
NSArray&NSDictionary *& *propertyTypeList = [self ys_propertiesAndTypeList];<span style="color: #2
<span style="color: #3
id obj = [self new];<span style="color: #4
<span style="color: #5
for (NSString *key in dictionary) {<span style="color: #6
<span style="color: #7
if([list containsObject:key]){<span style="color: #8
<span style="color: #9
if ([dictionary[key] isKindOfClass:[NSDictionary class]]){ // 属性值为字典<span style="color: #0
<span style="color: #1
for(NSDictionary *dict in propertyTypeList){<span style="color: #2
<span style="color: #3
if([key isEqualToString: [NSString stringWithFormat:@"%@",dict.allKeys.firstObject]]){<span style="color: #4
<span style="color: #5
NSString *classTypeStr = dict[key];<span style="color: #6
Class class = NSClassFromString(classTypeStr);<span style="color: #7
<span style="color: #8
id objChild = [class ys_objectWithDictionary:dictionary[key]];<span style="color: #9
<span style="color: #0
[obj setValue:objChild forKey:key];<span style="color: #1
}<span style="color: #2
}<span style="color: #3
<span style="color: #4
}<span style="color: #5
else if([dictionary[key] isKindOfClass:[NSArray&NSDictionary *& class]]){ // 属性值为字典数组<span style="color: #6
<span style="color: #7
}<span style="color: #8
else{<span style="color: #9
[obj setValue:dictionary[key] forKey:key];<span style="color: #0
}<span style="color: #1
}<span style="color: #2
}<span style="color: #3
<span style="color: #4
return<span style="color: #5 }<span style="color: #6 <span style="color: #7 #pragma mark - 字典数组 -& 当前类的对象数组<span style="color: #8 + (NSArray *)ys_objectsWithDictionaryArray:(NSArray&NSDictionary *& *)dictArray {<span style="color: #9
<span style="color: #0
if (dictArray.count == <span style="color: #) {<span style="color: #1
return<span style="color: #2
}<span style="color: #3
<span style="color: #4
// 当前类的属性数组<span style="color: #5
NSArray *list = [self ys_propertiesList];<span style="color: #6
<span style="color: #7
NSArray&NSDictionary *& *propertyTypeList = [self ys_propertiesAndTypeList];<span style="color: #8
<span style="color: #9
NSMutableArray *arrayM = [NSMutableArray array];<span style="color: #0
for (NSDictionary *dictionary in dictArray) {<span style="color: #1
<span style="color: #2
id obj = [self new];<span style="color: #3
<span style="color: #4
for (NSString *key in dictionary) {<span style="color: #5
<span style="color: #6
if([list containsObject:key]){<span style="color: #7
<span style="color: #8
if ([dictionary[key] isKindOfClass:[NSDictionary class]]){ // 属性值为字典<span style="color: #9
<span style="color: #0
for(NSDictionary *dict in propertyTypeList){<span style="color: #1
<span style="color: #2
if([key isEqualToString: [NSString stringWithFormat:@"%@",dict.allKeys.firstObject]]){<span style="color: #3
<span style="color: #4
NSString *classTypeStr = dict[key];<span style="color: #5
Class class = NSClassFromString(classTypeStr);<span style="color: #6
<span style="color: #7
id objChild = [class ys_objectWithDictionary:dictionary[key]];<span style="color: #8
<span style="color: #9
[obj setValue:objChild forKey:key];<span style="color: #0
}<span style="color: #1
}<span style="color: #2
<span style="color: #3
}<span style="color: #4
else if([dictionary[key] isKindOfClass:[NSArray&NSDictionary *& class]]){ // 属性值为字典数组<span style="color: #5
<span style="color: #6
}<span style="color: #7
else{<span style="color: #8
[obj setValue:dictionary[key] forKey:key];<span style="color: #9
}<span style="color: #0
}<span style="color: #1
}<span style="color: #2
<span style="color: #3
[arrayM addObject:obj];<span style="color: #4
}<span style="color: #5
<span style="color: #6
return arrayM.<span style="color: #7 }<span style="color: #8 <span style="color: #9 @end 3、和YYModel一样,如果对象的一个属性为另一个自定义对象,那么同样可以起到连转的作用;4、但比较遗憾的是,也是和YYModel一样,如果有一个属性是数组,又添加了泛型约束,没有取到这个数组的泛型约束。我记得,YYModel就有这个问题,因为取不到泛型约束,所以当有属性为数组的时候,需要手动指定数组里面的元素类型。希望各位大神看到后不吝赐教。 5、最后贴出一个小且非常有趣的小东东,里面的key就是我用上面的 “ys_ivarsList” 获取到所有成员变量,然后一级一级找的^_^<span style="color: #
// 设置随机颜色给Application的statusBar,从此妈妈再也不用担心statusBar的背景色<span style="color: #
id bgStyle = [[UIApplication sharedApplication] valueForKeyPath:@"statusBar.backgroundView.style"];<span style="color: #
[bgStyle setValue:[UIColor redColor] forKey:@"backgroundColor"];<span style="color: #
// frame = (5 649; 55 13)<span style="color: #
// 修改高德地图和logo,删除和替换自己随意定<span style="color: #
UIImageView *imgV = [mapView valueForKey:@"logoImageView"]; // 这就就是高德地图的logo<span style="color: #
imgV.image = //
我们把imageView的图片置为nil<span style="color: #
[mapView setValue:imgV forKey:@"logoImageView"]; // 哈哈,这个高德地图的logo就不见了,妈妈从此再也不需要担心logo了
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动ios-教你一步一步实现自己的字典转模型库 - 简书
ios-教你一步一步实现自己的字典转模型库
我们在iOS开发中,一般会使用MVC或者MVVM等模式。当我们从接口中拿到数据时,我们需要把数据转成模型使用。下面我就带大家一起用runtime一步一步的来完成这个转换框架
1、先写一个简单的字典到模型的转换
模型TestModel
@interface TestModel : NSObject
@property (nonatomic, copy) NSString *
@property (nonatomic, copy) NSString *
@property (nonatomic, copy) NSString *
@property (nonatomic, assign) NSI
控制器ViewController中
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"字典转模型";
NSDictionary *dicTest = @{@"name":@"张三",
@"phone":@"110",
@"age":@"10"};
TestModel *model = [TestModel yj_initWithDictionary:dicTest];
NSLog(@"model-----name:%@, phone:%@, address:%@, age:%@", model.name, model.phone, model.address, @(model.age));
字典转模型的分类中
@implementation NSObject (YJModelDicTransform)
//字典转模型
+ (instancetype)yj_initWithDictionary:(NSDictionary *)dic
id myObj = [[self alloc] init];
unsigned int outC
//获取类中的所有成员属性
objc_property_t *arrPropertys = class_copyPropertyList([self class], &outCount);
for (NSInteger i = 0; i & outC i ++) {
objc_property_t property = arrPropertys[i];
//获取属性名字符串
//model中的属性名
NSString *propertyName = [NSString stringWithUTF8String:property_getName(property)];
id propertyValue = dic[propertyName];
if (propertyValue != nil) {
[myObj setValue:propertyValue forKey:propertyName];
free(arrPropertys);
return myO
//数组转模型数组,现在还用不了,因为还没有方法知道数组中保存的是什么类型,后面会处理
+ (instancetype)yj_initWithArray:(NSArray *)arr
NSAssert([arr isKindOfClass:[NSArray class]], @"不是数组");
NSMutableArray *arrModels = [NSMutableArray array];
[arr enumerateObjectsUsingBlock:^(id
_Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isKindOfClass:[NSArray class]]) {
[arrModels addObject:[self yj_initWithArray:obj]];
id model = [self yj_initWithDictionary:obj];
[arrModels addObject:model];
return arrM
控制台打印 15:55:18.231 YJModelDicTransform[] model-----name:张三, phone:110, address:(null), age:10
2、模型中嵌套有模型
第一步完成后我们已经可以自动完成字典和模型的转换了,但是还不完善,比如我们的字典的value中如果有字典或者数组类型的话,程序就识别不了,所以我们现在就来处理这种情况
先通过runtime来获取模型中属性的类型,然后根据不同类型来处理
@interface TestModel : NSObject
@property (nonatomic, copy) NSString *
@property (nonatomic, copy) NSString *
@property (nonatomic, copy) NSString *
@property (nonatomic, assign) NSI
//模型中嵌套UserModel模型
@property (nonatomic, strong) UserModel *
@interface UserModel : NSObject
@property (nonatomic, copy) NSString *userN
@property (nonatomic, copy) NSString *userId;
NSString *const YJClassType_object
@"对象类型";
NSString *const YJClassType_basic
@"基础数据类型";
NSString *const YJClassType_other
@implementation NSObject (YJModelDicTransform)
+ (instancetype)yj_initWithDictionary:(NSDictionary *)dic
id myObj = [[self alloc] init];
unsigned int outC
//获取类中的所有成员属性
objc_property_t *arrPropertys = class_copyPropertyList([self class], &outCount);
for (NSInteger i = 0; i & outC i ++) {
objc_property_t property = arrPropertys[i];
//获取属性名字符串
//model中的属性名
NSString *propertyName = [NSString stringWithUTF8String:property_getName(property)];
id propertyValue = dic[propertyName];
if (propertyValue == nil) {
//获取属性是什么类型的
NSDictionary *dicPropertyType = [self propertyTypeFromProperty:property];
NSString *propertyClassType = [dicPropertyType objectForKey:@"classType"];
NSString *propertyType = [dicPropertyType objectForKey:@"type"];
if ([propertyType isEqualToString:YJClassType_object]) {
if ([propertyClassType isEqualToString:@"NSArray"] || [propertyClassType isEqualToString:@"NSMutableArray"]) {
//数组类型,现在还用不了,因为还没有方法知道数组中保存的是什么类型,后面会处理
else if ([propertyClassType isEqualToString:@"NSDictionary"] || [propertyClassType isEqualToString:@"NSMutableDictionary"]) {
//字典类型
不考虑,一般不会用字典,用自定义model
else if ([propertyClassType isEqualToString:@"NSString"]) {
//字符串类型
if (propertyValue != nil) {
[myObj setValue:propertyValue forKey:propertyName];
//自定义类型,循环调用,一直到不是自定义类型
propertyValue = [NSClassFromString(propertyClassType) yj_initWithDictionary:propertyValue];
if (propertyValue != nil) {
[myObj setValue:propertyValue forKey:propertyName];
else if ([propertyType isEqualToString:YJClassType_basic]) {
//基本数据类型
if ([propertyClassType isEqualToString:@"c"]) {
//bool类型
NSString *lowerValue = [propertyValue lowercaseString];
if ([lowerValue isEqualToString:@"yes"] || [lowerValue isEqualToString:@"true"]) {
propertyValue = @(YES);
} else if ([lowerValue isEqualToString:@"no"] || [lowerValue isEqualToString:@"false"]) {
propertyValue = @(NO);
propertyValue = [[[NSNumberFormatter alloc] init] numberFromString:propertyValue];
if (propertyValue != nil) {
[myObj setValue:propertyValue forKey:propertyName];
//其他类型
free(arrPropertys);
return myO
//获取属性的类型
- (NSDictionary *)propertyTypeFromProperty:(objc_property_t)property
//获取属性的类型, 类似 T@"NSString",C,N,V_name
T@"UserModel",&,N,V_user
NSString *propertyAttrs = @(property_getAttributes(property));
NSMutableDictionary *dicPropertyType = [NSMutableDictionary dictionary];
//截取类型
NSRange commaRange = [propertyAttrs rangeOfString:@","];
NSString *propertyType = [propertyAttrs substringWithRange:NSMakeRange(1, commaRange.location - 1)];
NSLog(@"属性类型:%@, %@", propertyAttrs, propertyType);
if ([propertyType hasPrefix:@"@"] && propertyType.length & 2) {
//对象类型
NSString *propertyClassType = [propertyType substringWithRange:NSMakeRange(2, propertyType.length - 3)];
[dicPropertyType setObject:propertyClassType forKey:@"classType"];
[dicPropertyType setObject:YJClassType_object forKey:@"type"];
else if ([propertyType isEqualToString:@"q"]) {
//NSInteger类型
[dicPropertyType setObject:@"NSInteger" forKey:@"classType"];
[dicPropertyType setObject:YJClassType_basic forKey:@"type"];
else if ([propertyType isEqualToString:@"d"]) {
//CGFloat类型
[dicPropertyType setObject:@"CGFloat" forKey:@"classType"];
[dicPropertyType setObject:YJClassType_basic forKey:@"type"];
else if ([propertyType isEqualToString:@"c"]) {
//BOOL类型
[dicPropertyType setObject:@"BOOL" forKey:@"classType"];
[dicPropertyType setObject:YJClassType_basic forKey:@"type"];
[dicPropertyType setObject:YJClassType_other forKey:@"type"];
return dicPropertyT
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"字典转模型";
NSDictionary *dicTest = @{@"name":@"张三",
@"phone":@"110",
@"age":@"10",
@"user":@{@"userId":@"2"}};
TestModel *model = [TestModel yj_initWithDictionary:dicTest];
NSLog(@"model-----name:%@, phone:%@, address:%@, age:%@, userId:%@, userName:%@", model.name, model.phone, model.address, @(model.age), model.user.userId, model.user.userName);
控制台打印 16:39:52.079 YJModelDicTransform[] 属性类型:T@"NSString",C,N,V_name, @"NSString" 16:39:52.080 YJModelDicTransform[] 属性类型:T@"NSString",C,N,V_phone, @"NSString" 16:39:52.080 YJModelDicTransform[] 属性类型:Tq,N,V_age, q 16:39:52.081 YJModelDicTransform[] 属性类型:T@"UserModel",&,N,V_user, @"UserModel" 16:39:52.081 YJModelDicTransform[] 属性类型:T@"NSString",C,N,V_userId, @"NSString" 16:39:52.081 YJModelDicTransform[] model-----name:张三, phone:110, address:(null), age:10, userId:2, userName:(null)
3、处理模型中有数组属性的情况
第二步之后程序可以处理模型中包含模型的情况, 但是还不能处理模型中有数组的情况,因为数组中存储的类型需要人为的告诉程序,下面我们添加一个协议来来处理这种情况
先创建一个协议, 然后让分类遵循它
@protocol YJModelDicTransform &NSObject&
数组中存储的类型
@return key --- 属性名,
value --- 数组中存储的类型
+ (NSDictionary *)yj_objectClassInA
@interface NSObject (YJModelDicTransform)&YJModelDicTransform&
+ (instancetype)yj_initWithDictionary:(NSDictionary *)
在model中实现这个方法
@implementation TestModel
+ (NSDictionary *)yj_objectClassInArray
return @{@"arrUsers":@"UserModel"};
+ (NSDictionary *)yj_propertykeyReplacedWithValue
return @{@"_id":@"id"};
//字典转模型
+ (instancetype)yj_initWithDictionary:(NSDictionary *)dic
id myObj = [[self alloc] init];
unsigned int outC
//获取类中的所有成员属性
objc_property_t *arrPropertys = class_copyPropertyList([self class], &outCount);
for (NSInteger i = 0; i & outC i ++) {
objc_property_t property = arrPropertys[i];
//获取属性名字符串
//model中的属性名
NSString *propertyName = [NSString stringWithUTF8String:property_getName(property)];
id propertyValue = dic[propertyName];
if (propertyValue == nil) {
//获取属性是什么类型的
NSDictionary *dicPropertyType = [self propertyTypeFromProperty:property];
NSString *propertyClassType = [dicPropertyType objectForKey:@"classType"];
NSString *propertyType = [dicPropertyType objectForKey:@"type"];
if ([propertyType isEqualToString:YJClassType_object]) {
if ([propertyClassType isEqualToString:@"NSArray"] || [propertyClassType isEqualToString:@"NSMutableArray"]) {
//数组类型
if ([self respondsToSelector:@selector(yj_objectClassInArray)]) {
id propertyValueType = [[self yj_objectClassInArray] objectForKey:propertyName];
if ([propertyValueType isKindOfClass:[NSString class]]) {
propertyValue = [NSClassFromString(propertyValueType) yj_initWithArray:propertyValue];
propertyValue = [propertyValueType yj_initWithArray:propertyValue];
if (propertyValue != nil) {
[myObj setValue:propertyValue forKey:propertyName];
else if ([propertyClassType isEqualToString:@"NSDictionary"] || [propertyClassType isEqualToString:@"NSMutableDictionary"]) {
//字典类型
不考虑,一般不会用字典,用自定义model
else if ([propertyClassType isEqualToString:@"NSString"]) {
//字符串类型
if (propertyValue != nil) {
[myObj setValue:propertyValue forKey:propertyName];
//自定义类型,循环调用,一直到不是自定义类型
propertyValue = [NSClassFromString(propertyClassType) yj_initWithDictionary:propertyValue];
if (propertyValue != nil) {
[myObj setValue:propertyValue forKey:propertyName];
else if ([propertyType isEqualToString:YJClassType_basic]) {
//基本数据类型
if ([propertyClassType isEqualToString:@"c"]) {
//bool类型
NSString *lowerValue = [propertyValue lowercaseString];
if ([lowerValue isEqualToString:@"yes"] || [lowerValue isEqualToString:@"true"]) {
propertyValue = @(YES);
} else if ([lowerValue isEqualToString:@"no"] || [lowerValue isEqualToString:@"false"]) {
propertyValue = @(NO);
propertyValue = [[[NSNumberFormatter alloc] init] numberFromString:propertyValue];
if (propertyValue != nil) {
[myObj setValue:propertyValue forKey:propertyName];
//其他类型
free(arrPropertys);
return myO
4、字典中包含一些iOS不能用的字段
有时候接口返回的数据中有id等iOS中和关键字重合的字段, 这个时候我们需要将id手动映射到模型中对应的属性中
我们在刚刚创建的协议中在添加一个方法来处理
@protocol YJModelDicTransform &NSObject&
数组中存储的类型
@return key --- 属性名,
value --- 数组中存储的类型
+ (NSDictionary *)yj_objectClassInA
替换一些字段
@return key -- 模型中的字段, value --- 字典中的字段
+ (NSDictionary *)yj_propertykeyReplacedWithV
在model中实现这个方法
+ (NSDictionary *)yj_propertykeyReplacedWithValue
return @{@"_id":@"id"};
+ (instancetype)yj_initWithDictionary:(NSDictionary *)dic
id myObj = [[self alloc] init];
unsigned int outC
//获取类中的所有成员属性
objc_property_t *arrPropertys = class_copyPropertyList([self class], &outCount);
for (NSInteger i = 0; i & outC i ++) {
objc_property_t property = arrPropertys[i];
//获取属性名字符串
//model中的属性名
NSString *propertyName = [NSString stringWithUTF8String:property_getName(property)];
//字典中的属性名
NSString *newPropertyN
if ([self respondsToSelector:@selector(yj_propertykeyReplacedWithValue)]) {
newPropertyName = [[self yj_propertykeyReplacedWithValue] objectForKey:propertyName];
if (!newPropertyName) {
newPropertyName = propertyN
NSLog(@"属性名:%@", propertyName);
id propertyValue = dic[newPropertyName];
if (propertyValue == nil) {
//获取属性是什么类型的
NSDictionary *dicPropertyType = [self propertyTypeFromProperty:property];
NSString *propertyClassType = [dicPropertyType objectForKey:@"classType"];
NSString *propertyType = [dicPropertyType objectForKey:@"type"];
if ([propertyType isEqualToString:YJClassType_object]) {
if ([propertyClassType isEqualToString:@"NSArray"] || [propertyClassType isEqualToString:@"NSMutableArray"]) {
//数组类型
if ([self respondsToSelector:@selector(yj_objectClassInArray)]) {
id propertyValueType = [[self yj_objectClassInArray] objectForKey:propertyName];
if ([propertyValueType isKindOfClass:[NSString class]]) {
propertyValue = [NSClassFromString(propertyValueType) yj_initWithArray:propertyValue];
propertyValue = [propertyValueType yj_initWithArray:propertyValue];
if (propertyValue != nil) {
[myObj setValue:propertyValue forKey:propertyName];
else if ([propertyClassType isEqualToString:@"NSDictionary"] || [propertyClassType isEqualToString:@"NSMutableDictionary"]) {
//字典类型
不考虑,一般不会用字典,用自定义model
else if ([propertyClassType isEqualToString:@"NSString"]) {
//字符串类型
if (propertyValue != nil) {
[myObj setValue:propertyValue forKey:propertyName];
//自定义类型
propertyValue = [NSClassFromString(propertyClassType) yj_initWithDictionary:propertyValue];
if (propertyValue != nil) {
[myObj setValue:propertyValue forKey:propertyName];
else if ([propertyType isEqualToString:YJClassType_basic]) {
//基本数据类型
if ([propertyClassType isEqualToString:@"c"]) {
//bool类型
NSString *lowerValue = [propertyValue lowercaseString];
if ([lowerValue isEqualToString:@"yes"] || [lowerValue isEqualToString:@"true"]) {
propertyValue = @(YES);
} else if ([lowerValue isEqualToString:@"no"] || [lowerValue isEqualToString:@"false"]) {
propertyValue = @(NO);
propertyValue = [[[NSNumberFormatter alloc] init] numberFromString:propertyValue];
if (propertyValue != nil) {
[myObj setValue:propertyValue forKey:propertyName];
//其他类型
free(arrPropertys);
return myO
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"字典转模型";
NSDictionary *dicTest = @{@"id":@"121",
@"name":@"张三",
@"phone":@"110",
@"age":@"10",
@"user":@{@"userId":@"2"},
@"arrUsers":@[@{@"userId":@"2"},@{@"userId":@"2"},@{@"userId":@"2"}]};
TestModel *model = [TestModel yj_initWithDictionary:dicTest];
NSLog(@"model-----id:%@, name:%@, phone:%@, address:%@, age:%@, userId:%@, userName:%@", model._id, model.name, model.phone, model.address, @(model.age), model.user.userId, model.user.userName);
[model.arrUsers enumerateObjectsUsingBlock:^(UserModel *obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"arrUser----userId:%@", obj.userId);
控制台打印 17:17:03.245 YJModelDicTransform[] model-----id:121, name:张三, phone:110, address:(null), age:10, userId:2, userName:(null) 17:17:03.245 YJModelDicTransform[] arrUser----userId:2 17:17:03.245 YJModelDicTransform[] arrUser----userId:2 17:17:03.245 YJModelDicTransform[] arrUser----userId:2
到此,基本完成了字典转模型的功能。接下来就是要在实际项目中多用,找出bug和不足点,继续完善它。

我要回帖

更多关于 ios 对象类型转data 的文章

 

随机推荐