因項目中需要泣特,實現(xiàn)了一個模型轉(zhuǎn)換字典的方法,支持遞歸處理戚嗅。方便快速將模型轉(zhuǎn)換為字典或?qū)傩赞D(zhuǎn)化為json,與javascript或后臺通信的需求。
.h文件:
#import <Foundation/Foundation.h>
@interface NSObject (ModelToDictionary)
/**
* 模型轉(zhuǎn)字典
*
* @return 字典
*/
- (NSDictionary *)dictionaryFromModel;
/**
* 帶model的數(shù)組或字典轉(zhuǎn)字典
*
* @param object 帶model的數(shù)組或字典轉(zhuǎn)
*
* @return 字典
*/
- (id)idFromObject:(nonnull id)object;
@end
.m文件:
#import "NSObject+ModelToDictionary.h"
#import <objc/runtime.h>
@implementation NSObject (ModelToDictionary)
- (NSDictionary *)dictionaryFromModel
{
unsigned int count = 0;
objc_property_t *properties = class_copyPropertyList([self class], &count);
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:count];
for (int i = 0; i < count; i++) {
NSString *key = [NSString stringWithUTF8String:property_getName(properties[i])];
id value = [self valueForKey:key];
//only add it to dictionary if it is not nil
if (key && value) {
if ([value isKindOfClass:[NSString class]]
|| [value isKindOfClass:[NSNumber class]]) {
// 普通類型的直接變成字典的值
[dict setObject:value forKey:key];
}
else if ([value isKindOfClass:[NSArray class]]
|| [value isKindOfClass:[NSDictionary class]]) {
// 數(shù)組類型或字典類型
[dict setObject:[self idFromObject:value] forKey:key];
}
else {
// 如果model里有其他自定義模型涂邀,則遞歸將其轉(zhuǎn)換為字典
[dict setObject:[value dictionaryFromModel] forKey:key];
}
} else if (key && value == nil) {
// 如果當前對象該值為空,設為nil脊串。在字典中直接加nil會拋異常,需要加NSNull對象
[dict setObject:[NSNull null] forKey:key];
}
}
free(properties);
return dict;
}
- (id)idFromObject:(nonnull id)object
{
if ([object isKindOfClass:[NSArray class]]) {
if (object != nil && [object count] > 0) {
NSMutableArray *array = [NSMutableArray array];
for (id obj in object) {
// 基本類型直接添加
if ([obj isKindOfClass:[NSString class]]
|| [obj isKindOfClass:[NSNumber class]]) {
[array addObject:obj];
}
// 字典或數(shù)組需遞歸處理
else if ([obj isKindOfClass:[NSDictionary class]]
|| [obj isKindOfClass:[NSArray class]]) {
[array addObject:[self idFromObject:obj]];
}
// model轉(zhuǎn)化為字典
else {
[array addObject:[obj dictionaryFromModel]];
}
}
return array;
}
else {
return object ? : [NSNull null];
}
}
else if ([object isKindOfClass:[NSDictionary class]]) {
if (object && [[object allKeys] count] > 0) {
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
for (NSString *key in [object allKeys]) {
// 基本類型直接添加
if ([object[key] isKindOfClass:[NSNumber class]]
|| [object[key] isKindOfClass:[NSString class]]) {
[dic setObject:object[key] forKey:key];
}
// 字典或數(shù)組需遞歸處理
else if ([object[key] isKindOfClass:[NSArray class]]
|| [object[key] isKindOfClass:[NSDictionary class]]) {
[dic setObject:[self idFromObject:object[key]] forKey:key];
}
// model轉(zhuǎn)化為字典
else {
[dic setObject:[object[key] dictionaryFromModel] forKey:key];
}
}
return dic;
}
else {
return object ? : [NSNull null];
}
}
return [NSNull null];
}
@end
調(diào)用:
[someModel dictionaryFromModel];