5 Stimmen

Wie bestimmt man die Klasse einer Objective-C-Eigenschaft?

Also, nehmen wir an, ich habe eine Eigenschaft in einer Klasse:

@interface MyObject : NSObject {
    MyOtherObject *someOtherObject;
}

@property (nonatomic, copy) MyOtherObject *someOtherObject;

@end

Ich versuche etwas zu erstellen, um eine API-Antwort in die richtigen Objekte zu deserialisieren, ohne explizit zu definieren, welche Klasse jeder API-Attribut zugeordnet ist. Gibt es eine Möglichkeit herauszufinden, zu welcher Klasse eine Eigenschaft gehört, auch wenn sie nil ist? Was ich suche, ist eine Methode wie [MyObject classForProperty:@"someOtherObject"], die ein Class-Objekt zurückgeben würde. Beachten Sie - ich suche nicht nach isKindOfClass: oder einfach nach class, da diese nicht bei einem nil-Wert funktionieren.

Im schlimmsten Fall kann ich einfach manuell eine Liste von Eigenschaftsklassen definieren, aber es wäre wirklich schön, wenn es einen eingebauten Weg gäbe, um dies zu tun.

2voto

Kyle Slattery Punkte 30730

Ok, ich habe das herausgefunden, nachdem ich auf diese Frage gestoßen bin: In Objective-C feststellen, ob eine Eigenschaft ein int, float, double, NSString, NSDate, NSNumber usw. ist

Hier ist der Code:

@interface NSObject (Properties)

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

@end

#import 

@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

Es scheint für mich ziemlich gut zu funktionieren, aber jede Änderung ist auf jeden Fall willkommen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X