国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

iOS反射:把對(duì)象直接轉(zhuǎn)化成NSDictionary

2019-11-14 19:48:45
字體:
供稿:網(wǎng)友

在IOS的網(wǎng)絡(luò)編程中,通常我們需要將一些實(shí)體數(shù)據(jù)保存到NSDictionary,在獲得NSDictionary后即可直接使用iOS 5后的NSJSONSerialization類型的dataWithJSONObject方法就可以返回包含JSON字符串的NSData對(duì)象了。然后調(diào)用ASIHttPRequest。

如果類屬性中還包含其他類,或更多的嵌套下怎么辦呢,自己來編寫會(huì)非常復(fù)雜,這里我們可以通過反射來編寫,基本思路就是通過反射獲得屬性名稱,通過KVC獲得值,剩下的就是NSDictionary和NSArray的循環(huán)嵌套了。

IOS的反射引用<objc/runtime.h>,使用方法為class_copyPropertyList和property_getName

注意原來代碼中之引用了NSString,NSNumber,NSNull類型的支持,可以加入更多的類型,根據(jù)需要添加吧我添加了NSDate類型

反射的詳細(xì)介紹官方網(wǎng)址:點(diǎn)擊

示例代碼

#import <Foundation/Foundation.h>@interface BIDObjectToNsDictionary : NSObject+ (NSDictionary*)getObjectData:(id)obj;@end
#import "BIDObjectToNsDictionary.h"#import <objc/runtime.h>+ (NSDictionary*)getObjectData:(id)obj{    NSMutableDictionary *dic = [NSMutableDictionary dictionary];    unsigned int propsCount;    objc_property_t *props = class_copyPropertyList([obj class], &propsCount);//獲得屬性列表    for(int i = 0;i < propsCount; i++)    {        objc_property_t prop = props[i];                NSString *propName = [NSString stringWithUTF8String:property_getName(prop)];//獲得屬性的名稱        id value = [obj valueForKey:propName];//kvc讀值        if(value == nil)        {            value = [NSNull null];        }        else        {            value = [self getObjectInternal:value];//自定義處理數(shù)組,字典,其他類        }        [dic setObject:value forKey:propName];    }    return dic;}+ (id)getObjectInternal:(id)obj{    if([obj isKindOfClass:[NSString class]]       || [obj isKindOfClass:[NSNumber class]]       || [obj isKindOfClass:[NSNull class]]
    || [obj isKindOfClass:[NSDate class]])//支持類型-----可以擴(kuò)充 {
return obj; } if([obj isKindOfClass:[NSArray class]]) { NSArray *objarr = obj; NSMutableArray *arr = [NSMutableArray arrayWithCapacity:objarr.count]; for(int i = 0;i < objarr.count; i++) { [arr setObject:[self getObjectInternal:[objarr objectAtIndex:i]] atIndexedSubscript:i]; } return arr; } if([obj isKindOfClass:[NSDictionary class]]) { NSDictionary *objdic = obj; NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:[objdic count]]; for(NSString *key in objdic.allKeys) { [dic setObject:[self getObjectInternal:[objdic objectForKey:key]] forKey:key];//對(duì)字典類型進(jìn)行解析,遞歸調(diào)用 } return dic; } return [self getObjectData:obj];//對(duì)其他class解析,遞歸調(diào)用@end

參考原文http://ios.9tech.cn/news/2013/0918/28899.html


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 札达县| 大邑县| 石渠县| 连南| 阿城市| 依安县| 滕州市| 万山特区| 马尔康县| 怀集县| 聂拉木县| 馆陶县| 瑞安市| 米易县| 龙口市| 苏尼特右旗| 公主岭市| 尼勒克县| 无棣县| 综艺| 刚察县| 宝山区| 乌苏市| 广昌县| 石阡县| 彭阳县| 偏关县| 泰和县| 汤原县| 遂宁市| 白朗县| 平舆县| 开平市| 田阳县| 博白县| 颍上县| 宝兴县| 巩义市| 天长市| 阳东县| 敦煌市|