今天遇到一个问题,从服务器端传来的json数据,在ios里面被解析成了NSArray和NSDictionary,当用于CoreData时,需要对应转换赋值,有时也需要从一个model转化为一个字典,原本为一个个属性手动赋值的,现在感觉这种方法太笨了,联想到java和python里的反射,想想objective-c也应有这种api,写了一个NSManageObject的分类
@implementation NSManagedObject (toDictionary)
- (void)setWithDictionary:(NSDictionary *)dictionary {
for (NSString *key in [dictionary keyEnumerator]) {
NSString * methodName = [NSString stringWithFormat:@"set%@:", [key capitalizedString]];
SEL selector = NSSelectorFromString(methodName);
if ([self respondsToSelector:selector]) {
[self performSelector:selector withObject:[dictionary objectForKey:key]];
}
}
}
上面是用字典给一个model赋值,通过遍历字典里的key,调用对应的setter方法来给model赋值
- (NSDictionary *)getDictionary
{
NSMutableDictionary *mutableDictionary = [NSMutableDictionary new];
unsigned int nCount = 0;
objc_objectptr_t *popertylist = class_copyPropertyList([self class], &nCount);
for (int i = 0; i < nCount; i++) {
objc_objectptr_t property = popertylist[i];
NSString *attr_name = [NSString stringWithUTF8String:property_getName(property)];
SEL selector = NSSelectorFromString(attr_name);
if ([self respondsToSelector:selector]) {
NSLog(@"%@",[self performSelector:selector]);
[mutableDictionary setObject:[self performSelector:selector] forKey:attr_name];
}
}
return [[NSDictionary alloc] initWithDictionary:mutableDictionary];
}
@end
上面为把一个model转化为一个字典,属性名对应key,属性值对应value,通过objective-c的反射机制实现