将model转化为字典
刚入行时就见过项目里有mode转化为字典的代码,后来用过MJExtension的第三方库,非常好用,其实原理就是利用runtime遍历所有属性值,然后进行转化。但是自己从来没有动手写过~~~今天亲自写一写
1.先用runtime遍历所有属性值
代码如下:
- (NSDictionary *)dicFromObject:(NSObject *)object {
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
unsigned int count;
objc_property_t *propertyList = class_copyPropertyList([object class], &count);
for (int i = 0; i < count; i++) {
objc_property_t property = propertyList[i];
const char *cName = property_getName(property);
NSString *name = [NSString stringWithUTF8String:cName];
NSObject *value = [object valueForKey:name];//valueForKey返回的数字和字符串都是对象
if (value == nil) {
//null
//[dic setObject:[NSNull null] forKey:name];//这行可以注释掉?????
} else {
//model
[dic setObject:[self dicFromObject:value] forKey:name];
}
}
return [dic copy];
}
这时我发现上面的代码只能转化
简单的model, 而value的可能情况很多,可能是数组,可能是字典,一会又发现数组或字典里可能嵌套数组或字典或model,我的妈妈,单纯一个递归方法根本无法实现所有的情况,还需要再添加方法。这么太复杂吗?我记得别人写时很简单呀。于是我百度了一下,几乎所有代码都是上述类似代码,我也是醉了。。这根本无法适用在实际的项目里。
2.代码改进如下:
//model转化为字典
- (NSDictionary *)dicFromObject:(NSObject *)object {
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
unsigned int count;
objc_property_t *propertyList = class_copyPropertyList([object class], &count);
for (int i = 0; i < count; i++) {
objc_property_t property = propertyList[i];
const char *cName = property_getName(property);
NSString *name = [NSString stringWithUTF8String:cName];
NSObject *value = [object valueForKey:name];

这篇博客介绍了如何利用Objective-C的Runtime机制将Model转换为字典。首先,通过Runtime遍历Model的所有属性值,然后对不同类型的值进行处理。作者发现简单的递归方法无法应对所有情况,如数组、字典等复杂结构。通过改进代码,实现了能够处理任意嵌套情况的转换功能,并给出了测试用例的示例。
最低0.47元/天 解锁文章
1359

被折叠的 条评论
为什么被折叠?



