2011-05-11 16 views
5

Ok, así que decir que tengo una propiedad en una clase:¿Cómo se determina la clase de la propiedad Objective-C?

@interface MyObject : NSObject { 
    MyOtherObject *someOtherObject; 
} 

@property (nonatomic, copy) MyOtherObject *someOtherObject; 

@end 

Estoy intentando crear algo deserializar una respuesta del API en los objetos correctos sin definir explícitamente qué clase de cada atributo API de Google Maps a. Entonces, ¿hay alguna forma de que averigüe qué clase es una propiedad, incluso si es nil? Lo que estoy buscando es algún método como [MyObject classForProperty:@"someOtherObject"] que devolvería un objeto Class. Nota: No estoy buscando isKindOfClass: o simplemente class, ya que no funcionarán en un valor de nil.

En el peor de los casos, puedo definir manualmente una lista de clases de propiedades, pero sería muy bueno si hubiera alguna forma de hacerlo.

Respuesta

2

Ok, terminé calcular esto después de venir a través de esta pregunta: In Objective-C Determine if a Property is an int, float, double, NSString, NSDate, NSNumber, etc

Aquí está el código:

@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 

Parece que funciona bastante bien para mí, pero las modificaciones son sin duda bienvenida.

+1

Ewww ... realmente no quieres hacer eso. La cadena de codificación de tipo '@ property' es terriblemente frágil, es probable que cambie en futuros compiladores, y, en general, este tipo de patrón de codificación se desaconseja. Es mucho mejor crear una capa de descripción de modelo propia (o usar datos básicos). – bbum

+0

¿Por qué no utilizar codificación de clave-valor para deserializar? –

+0

bbum - es bueno saber, tal vez termine haciendo manualmente la descripción del modelo –

Cuestiones relacionadas