Necesito determinar el tipo de propiedad de un objeto (pasado por nombre) para realizar la deserialización desde XML. Tengo algunos pseudo-código general (sin embargo estoy seguro de cómo realizar estas comparaciones en Objective-C):En Objective-C Determine si una propiedad es un int, float, double, NSString, NSDate, NSNumber, etc.
id object = [[[Record alloc] init] autorelease];
NSString *element = @"date";
NSString *data = @"2010-10-16";
objc_property_t property = class_getProperty([object class], [element UTF8String]);
const char *attributes = property_getAttributes(property);
char buffer[strlen(attributes) + 1];
strcpy(buffer, attributes);
char *attribute = strtok(buffer, ",");
if (*attribute == 'T') attribute++; else attribute = NULL;
if (attribute == NULL);
else if (strcmp(attribute, "@\"NSDate\"") == 0) [object setValue:[NSDate convertToDate:self.value] forKey:element];
else if (strcmp(attribute, "@\"NSString\"") == 0) [object setValue:[NSString convertToString:self.value] forKey:element];
else if (strcmp(attribute, "@\"NSNumber\"") == 0) [object setValue:[NSNumber convertToNumber:self.value] forKey:element];
he mirado a través de la class_getProperty y property_getAttributes, sin embargo todavía no estoy seguro de cómo hacer la comparaciones anteriores.
+1 valueForKey:/setValueForKey :. El autoboxing/unboxing usa NSNumber para tipos básicos y NSValue para tipos compuestos (es decir, structs); para obtener más detalles, consulte http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/DataTypes.html –
¡Gracias Dave por la respuesta detallada! No estoy seguro de cómo utilizar el primer método (¿no va a valueForKey devolver nil hasta que haya terminado de decodificar el objeto, ya que todas las propiedades serán nulas? El segundo método (el método que he estado intentando), funciona para escalares, pero no parece funcionar para non-escalars. Por ejemplo, '@encode (NSDate *)' da "@", pero obtener los atributos para '@property (no atómico, retener) NSDate * date' da "T @" NSDate ", &, N, Vdate" (no estoy seguro de por qué la sección de atributo no es la misma, dice que usa @encode). ¿Alguna idea? Actualicé mi pregunta con mi último código. ¡Gracias! –
@Kevin sí, el La primera opción requiere una instancia del objeto. En cuanto a la segunda, se me olvidó que la propiedad codifica un poco más acerca del tipo que '@ encode'. Sin embargo, podría usar esta como ventaja. Si el primer carácter es' @ ', luego vea si puede extraer un nombre de clase entre las marcas '' ' –