iOS 반사: 객체를 NSDictionary로 직접 변환
5977 단어 ios
클래스 속성에 다른 클래스가 포함되어 있거나 더 많은 플러그인을 끼워 넣으면 어떻게 합니까? 스스로 작성하는 것은 매우 복잡합니다. 여기서 우리는 반사를 통해 작성할 수 있습니다. 기본적인 사고방식은 반사를 통해 속성 이름을 얻고 KVC를 통해 값을 얻으며 나머지는 NSDictionary와 NSArray의 순환 플러그인입니다.
IOS의 반사 참조
원래 코드에서 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.