對象轉字典 iOS


最近在開發SDK,我開放給客戶model類設置信息后,對象轉字典,POST給后台。

思路:通過Runtime訪問屬性列表,快速轉換成字典。

 

FRObjectToDictionary.h類

 

#import <Foundation/Foundation.h>

 

@interface FRObjectToDictionary : NSObject

+ (NSDictionary*)getObjectData:(id)obj;

@end

 

 

FRObjectToDictionary.m類

 

 

#import "FRObjectToDictionary.h"

#import <objc/runtime.h>

@implementation FRObjectToDictionary

 

+ (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];//自定義處理數組,字典,其他類

        }

        [dic setObject:value forKey:propName];

    }

    return dic;

}

 

 

+ (id)getObjectInternal:(id)obj

{

    if([obj isKindOfClass:[NSString class]]

       || [obj isKindOfClass:[NSNumber class]]

       || [obj isKindOfClass:[NSNull class]])

    {

        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];

        }

        return dic;

    }

    return [self getObjectData:obj];

}

 

 

@end

 

 

調用時:

[FRObjectToDictionary getObjectData:aModel]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM