OC Runtime-JSON回転Model
3845 ワード
最近OC Runtimeを勉強していますが、勉強する上で最も重要なのは実践なので、実践の過程で実現した簡単なJSON回転モデルの練習項目を記録しておきます.このプロジェクトは主にRuntimeメカニズムを用いてClassの属性リストと属性に関する情報を取得する能力である.一、関連方法
たとえばUserクラスで属性nameとageが定義されています
次のコードで
次の印刷情報が得られます.
これらの印刷情報を見て、心の中にはいくつかの眉目があるのではないでしょうか.
二、JSON回転モデル
objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)
const char *property_getName(objc_property_t property)
const char *property_getAttributes(objc_property_t property)
class_copyPropertyListはクラスのプロパティリストproperty_を取得できます.getNameはプロパティ名property_を取得できます.getAttributesは属性のタイプなどの情報を取得できますたとえばUserクラスで属性nameとageが定義されています
@interface User : NSObject
@property (strong, nonatomic) NSString *name;
@property (assign, nonatomic) NSInteger age;
@end
次のコードで
Class clazz = [User class];
u_int count;
objc_property_t *properties = class_copyPropertyList(clazz, &count);
for (int i = 0; i < count; i++) {
const char *propName = property_getName(properties[i]);
const char *propAttr = property_getAttributes(properties[i]);
NSLog(@"%s: %s", propName, propAttr);
}
次の印刷情報が得られます.
name: T@"NSString",&,N,V_name
age: T^q,N,V_age
これらの印刷情報を見て、心の中にはいくつかの眉目があるのではないでしょうか.
二、JSON回転モデル
, json key 。
。
-(NSMutableDictionary *)keyMapper {
Class clazz = object_getClass(self);//
u_int count;//
objc_property_t *properties = class_copyPropertyList(clazz, &count);//
NSMutableDictionary *result = [NSMutableDictionary dictionary];
//
for (int i = 0; i < count; i++) {
//
const char *key = property_getName(properties[i]);
NSString *propName = [NSString stringWithCString:key encoding:NSUTF8StringEncoding];
// :T@"NSString",&,N,V_name
const char *attr = property_getAttributes(properties[i]);
//
NSArray *attrArray = [[NSString stringWithCString:attr encoding:NSUTF8StringEncoding] componentsSeparatedByString:@","];
NSArray *firstItems = [[attrArray.firstObject stringByReplacingOccurrencesOfString:@"\"" withString:@""] componentsSeparatedByString:@"@"];
Class type;
if (firstItems.count == 2) {
NSArray *info = [[firstItems.lastObject stringByReplacingOccurrencesOfString:@">" withString:@""] componentsSeparatedByString:@"
, Optional, , , , 。
NSDictionary *keyMapper = [self keyMapper];
for (NSString *key in keyMapper.allKeys) {
//
PropertyInfo *propInfo = [keyMapper objectForKey:key];
//
id value = [dict objectForKey:key];
/** Optional */
if (!propInfo.isOptional && value == nil) {
NSString *errMsg = [key stringByAppendingString:@" is can not nil!"];
*error = [NSError errorWithDomain:@"Json Error"
code:1 userInfo:@{@"errMsg": errMsg}];
return self;
}
//
if (![value isKindOfClass:propInfo.type]) {
NSString *errMsg = [key stringByAppendingString:@": type inconsistency!"];
*error = [NSError errorWithDomain:@"Json Error"
code:1 userInfo:@{@"errMsg": errMsg}];
return self;
}
if (value) [self setValue:value forKey:key];
}