2009-07-09 5 views
7

Je parcourt un NSArray contenant de nombreux types d'objets différents. Il existe plusieurs méthodes pour déterminer la classe de l'objet. Cependant, je n'ai pas été en mesure de trouver un bon moyen de savoir si un objet peut implémenter une fonction particulière. Je peux le mettre dans un try-catch, mais il affichera toujours un message d'erreur dans la console même si j'attrape l'erreur. Y a-t-il une meilleure manière de faire cela?Comment puis-je savoir si un objet implémente une méthode particulière?

Exemple simple:

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

Vérifier respondsToSelector que beaucoup ont répondu En Objective-C, il n'est pas bon d'utiliser des exceptions pour contrôler le flux du programme, sauf pour les erreurs de programmation. Comme vous vérifiez si une méthode existe dans ce cas, ce n'est pas approprié. – Abizern

Répondre

22

Comme suggéré, vous pouvez utiliser un message respondsToSelector: déclaré sur NSObject. Le code fourni serait comme

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

+1 pour la meilleure réponse avec un lien et un exemple de code. –

+8

N'oubliez pas que les deux points sont une partie inséparable du sélecteur. @selector (catFish) est complètement différent de @selector (catFish :). – Chuck

+0

hey est-il un moyen de faire quelque chose de similaire pour les propriétés? si j'ai un identifiant générique que j'ai tiré d'un tableau, je veux savoir s'il a une certaine propriété ... – topwik

5

Regardez la méthode respondsToSelector de NSObject

1

Une belle catégorie générique d'avoir dans votre code est la suivante:

@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 

Et puis vous pouvez utiliser:

[element performSelectorIfResponds:@selector(lowercaseString)]; 
Questions connexes