iOS 반사: 객체를 NSDictionary로 직접 변환

5977 단어 ios
IOS의 네트워크 프로그래밍에서 일반적으로 우리는 일부 실체 데이터를 NSDictionary에 저장해야 한다. NSDictionary를 획득한 후에 iOS 5를 직접 사용한 NSJSONserialization 유형의 데이터 WithJSONObject 방법은 JSON 문자열을 포함하는 NSData 대상을 되돌려줄 수 있다.그런 다음 ASIHttpRequest를 호출합니다.
클래스 속성에 다른 클래스가 포함되어 있거나 더 많은 플러그인을 끼워 넣으면 어떻게 합니까? 스스로 작성하는 것은 매우 복잡합니다. 여기서 우리는 반사를 통해 작성할 수 있습니다. 기본적인 사고방식은 반사를 통해 속성 이름을 얻고 KVC를 통해 값을 얻으며 나머지는 NSDictionary와 NSArray의 순환 플러그인입니다.
IOS의 반사 참조 , 사용 방법은classcopyPropertyList 및propertygetName
원래 코드에서 NSString, NSNumber, NSNull 유형의 지원을 인용하였으므로 더 많은 유형을 추가할 수 있습니다. 필요에 따라 추가하십시오. 저는 NSDate 유형을 추가하였습니다.
반사 상세 소개 공식 주소: 클릭
예제 코드
#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];// , , 

        }

        [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]])// ----- {
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];// class , @end

원문 참조http://ios.9tech.cn/news/2013/0918/28899.html

좋은 웹페이지 즐겨찾기