2009-07-09 20 views
7

Estoy iterando a través de un NSArray que contiene muchos tipos diferentes de objetos. Hay muchos métodos para descubrir qué clase es el objeto. Sin embargo, no he podido encontrar una buena forma de averiguar si un objeto puede implementar una función en particular. Puedo ponerlo en un try-catch, pero aún mostrará un mensaje de error en la consola, incluso si capté el error. ¿Hay una mejor manera de hacer esto?¿Cómo puedo averiguar si un objeto implementa un método en particular?

ejemplo simple:

@try { 
    if ([element lowercaseString]) { 
     //do something 
    } 
} 
@catch (id theException) { 
    // do something else 
} 
+1

Comprobar si respondsToSelector ya que muchos tienen contestada. En Objective-C no es un buen estilo (en mi opinión y en el de muchos otros) usar excepciones para controlar el flujo del programa excepto por errores en la programación. Como está comprobando si existe un método en este caso, no es apropiado. – Abizern

Respuesta

22

Como se sugiere, se puede utilizar respondsToSelector: mensaje declarado en NSObject. El código proporcionado sería como

if ([element respondsToSelector:@selector(lowercaseString)]) { 
    // ... do work 
} 
+1

+1 para una mejor respuesta con un ejemplo de enlace y código. –

+8

No olvide que los dos puntos son una parte inseparable del selector. @selector (catFish) es completamente diferente de @selector (catFish :). – Chuck

+0

hey ¿hay alguna manera de hacer algo similar para las propiedades? si tengo un ítem de identificación genérico que saqué de una matriz, quiero saber si tiene una propiedad determinada ... – topwik

5

Mira método respondsToSelector de NSObject

1

Un buen categoría genérica para tener en su código es la siguiente:

@interface NSObject (KMExtensions) 

- (id)performSelectorIfResponds:(SEL)aSelector; 
- (id)performSelectorIfResponds:(SEL)aSelector withObject:(id)anObject; 

@end 

@implementation NSObject (KMExtensions) 

- (id)performSelectorIfResponds:(SEL)aSelector 
{ 
    if ([self respondsToSelector:aSelector]) { 
     return [self performSelector:aSelector]; 
    } 
    return NULL; 
} 

- (id)performSelectorIfResponds:(SEL)aSelector withObject:(id)anObject 
{ 
    if ([self respondsToSelector:aSelector]) { 
     return [self performSelector:aSelector withObject:anObject]; 
    } 
    return NULL; 
} 

@end 

Y entonces usted puede utilizar:

[element performSelectorIfResponds:@selector(lowercaseString)]; 
Cuestiones relacionadas