Как определить класс свойства Objective-C? - PullRequest
5 голосов
/ 11 мая 2011

Хорошо, скажем, у меня есть свойство в классе:

@interface MyObject : NSObject {
    MyOtherObject *someOtherObject;
}

@property (nonatomic, copy) MyOtherObject *someOtherObject;

@end

Я пытаюсь создать что-то, чтобы десериализовать ответ API в правильные объекты без явного определения, к какому классу соответствует каждый атрибут api. Итак, могу ли я узнать, к какому классу относится свойство, даже если оно nil? То, что я ищу, - это какой-то метод типа [MyObject classForProperty:@"someOtherObject"], который бы возвращал объект Class. Примечание. Я не ищу isKindOfClass: или просто class, поскольку они не будут работать со значением nil.

В худшем случае, я могу просто вручную определить список классов свойств, но было бы очень хорошо, если бы было несколько встроенных способов сделать это.

1 Ответ

2 голосов
/ 11 мая 2011

Хорошо, я выяснил это после того, как наткнулся на этот вопрос: В Objective-C определите, является ли свойство типом int, float, double, NSString, NSDate, NSNumber и т. Д.

Вот код:

@interface NSObject (Properties)

+ (Class)classForProperty:(NSString *)propertyName;

@end

#import <objc/runtime.h>

@implementation NSObject (Properties)

+ (Class)classForProperty:(NSString *)propertyName {
    const char *attributes = property_getAttributes(class_getProperty([self class], [propertyName UTF8String]));
    NSString *attributesString = [NSString stringWithUTF8String:attributes];
    NSArray *parts = [attributesString componentsSeparatedByString:@","];
    NSString *typeString = [[parts objectAtIndex:0] substringFromIndex:1];

    if ([typeString hasPrefix:@"@"] && [typeString length] > 1) {
        NSString *name = [typeString substringWithRange:NSMakeRange(2, [typeString length]-3)];
        Class theClass = NSClassFromString(name);
        return theClass;
    }

    return nil;
}

@end

Мне кажется, это работает очень хорошо, но любые модификации, безусловно, приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...