2011-07-20 11 views
5

Estoy analizando algunos xml y actualizo el servidor con bastante frecuencia con nuevas funciones. Entonces, cuando agrego una nueva etiqueta o algo, mi aplicación, que analiza los bloqueos de datos cuando llamo porque currentElementValue aún no forma parte de mi clase. ¿Hay alguna manera de verificar si una clase tiene una propiedad, o debería simplemente atrapar la excepción que se plantea?¿Cómo ver si una clase tiene una propiedad?

[a setValue:currentElementValue forKey:elementName]; 

Gracias

Respuesta

8

Si no ha anulado los setter y getter nombres estándar que puede utilizar:

if ([object respondsToSelector:@selector(setProp:)]) { 

para el método de selección de una propiedad llamada "apuntalar", o:

if ([object respondsToSelector:@selector(prop)]) { 

por su método getter.

De lo contrario, si se ha utilizado una sintaxis como:

@property (assign, getter=hasProp) BOOL prop; 

al definir la propiedad, utilice el nombre que corresponde con la sintaxis anterior:

if ([object respondsToSelector:@selector(hasProp)]) { 
+2

No siempre es válido, ya que una propiedad puede definir diferentes métodos para su getter y setter. –

+2

'@property (assign, getter = isOpen) BOOL open;' - un patrón común – bshirley

+0

@Jonathan Grynspan: gracias por su comentario. ¡Edité mi respuesta para hacerla más precisa e incluí su idea! – sergio

18

muy simple:

if (class_getProperty([object class], "propertyName")) { 
    // it has that property! 
} 
+0

Impresionante eso es tan fácil – Chris

+1

Para iOS, necesita agregar '#import ' a su archivo – RunLoop

0

Primero debe escribir en mayúscula la primera letra del nombre de su propiedad.

NSString *capitalizedProperty = [NSString stringWithFormat:@"%@%@", [[propertyName substringToIndex:1] uppercaseString], [propertyName substringFromIndex:1]]; 

Luego debe hacer un selector que establecería la propiedad. (Si usted tiene una propiedad llamada "foo" de forma predeterminada el colocador de esta propiedad se llama "setFoo:".)

SEL propertySetter = NSSelectorFromString([NSString stringWithFormat:@"set%@:",capitalizedProperty]); 

Luego, como en la respuesta de Sergio, llame a:

if ([object respondsToSelector:propertySetter]) 
{ 
    [object setValue:value forKey:propertyName]; 
} 

Comprobar this post para ver cómo obtener las propiedades de un objeto.

Cuestiones relacionadas