Я пытаюсь глубоко проанализировать собственную коллекцию объектов в NSDictionary (для JSON).ObjC valueForKey не работает для NSNumber или UDT
У меня есть базовый класс объекта, который Все моих моделей расширения, и это BaseObject в свою очередь, расширяет NSObject:
@interface BaseObj : NSObject <DICTMaker>
- (NSMutableDictionary *) toDICT;
@end
В методе я использую ObjC-среды выполнения, чтобы получить список свойств. Любое свойство, которое я могу получить ссылку на использование [self valueForKey:]
, я иду вперед и вставляю в свой словарь имя и значение свойства.
Однако, я заметил, что NSNumber
s и пользовательские классы не добавляются в словарь! Мой синтаксический анализатор, безусловно, идентифицирует их, потому что я все это выплевываю в журнал; но [self valueForKey:]
возвращает nil
по всем NSNumbers
и объектам, определенным пользователем.
- (NSMutableDictionary *)toDICT {
NSMutableDictionary *props = [NSMutableDictionary dictionary];
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList([self class], &outCount);
for (i = 0; i < outCount; i++) {
objc_property_t property = properties[i];
// Both of these work, I promise:
NSString *propertyName = [NSString stringWithUTF8String:property_getName(property)];
NSString *propertyType = [NSString stringWithUTF8String:getPropertyType(property)];
NSLog(@"%@ of Type: %@", propertyName, propertyType);
id propertyValue = [self valueForKey:propertyName];
if ([ propertyValue respondsToSelector:@selector(toDICT:) ])
[ props setObject:[propertyValue toDICT] forKey:propertyName ];
else if (propertyValue)
[ props setObject:propertyValue forKey:propertyName ];
else
NSLog(@"Unable to get ref to: %@", propertyName);
}
free(properties);
return props;
}
Вот пример объекта я бросил на создатель:
@interface UserRegistrationLocation : BaseObj {
NSString *address, *street, *street_2, *city;
NSNumber *addr_state, *addr_zip;
}
@interface UserRegistrationContact : BaseObj {
NSString *first_name, *last_name;
NSString *p_phone_area, *p_phone_first_3, *p_phone_last_4;
NSString *s_phone_area, *s_phone_first_3, *s_phone_last_4;
}
@interface UserRegistration : BaseObj {
NSString *email, *password, *password_confirm;
NSNumber *referral;
UserRegistrationContact *primary, *secondary;
UserRegistrationLocation *address;
}
NSMutableDictionary *mydict = [myUserRegistration toDICT];
Полученный словарь содержится только записи для электронной почты, пароль и password_confirm:
[11012:f803] Unable to get ref to: referral
[11012:f803] Unable to get ref to: primary
[11012:f803] Unable to get ref to: secondary
[11012:f803] Unable to get ref to: address
[11012:f803] {"user":{"password":"haxme123","password_confirm":"haxme123","email":"[email protected]"}}
Любая помощь, пожалуйста = }!
Как смущающе, мои внутренние объекты были назначены данными ..но сами классы не были правильно инициализированы! -10programmer pnts –