2009-07-09 24 views
7

Ich durchläuft ein NSArray, das viele verschiedene Arten von Objekten enthält. Es gibt viele Methoden, um herauszufinden, welche Klasse das Objekt ist. Ich habe jedoch keinen guten Weg gefunden, herauszufinden, ob ein Objekt eine bestimmte Funktion implementieren kann. Ich kann es in einen try-catch setzen, aber es wird immer noch eine Fehlermeldung in der Konsole ausgeben, auch wenn ich den Fehler erhalte. Gibt es einen besseren Weg, dies zu tun?Wie kann ich herausfinden, ob ein Objekt eine bestimmte Methode implementiert?

Einfaches Beispiel:

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

prüfen respondsToSelector so viele haben antwortete. In Objective-C ist es (meiner Meinung nach und vieler anderer) nicht gut, Ausnahmen zu verwenden, um den Programmablauf zu steuern, mit Ausnahme von Programmierfehlern. Wenn Sie in diesem Fall prüfen, ob eine Methode existiert, ist sie nicht geeignet. – Abizern

Antwort

22

Wie bereits angedeutet, können Sie respondsToSelector: Nachricht auf NSObject erklärt verwenden. Der bereitgestellte Code wäre wie

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

+1 für die beste Antwort mit Link und Codebeispiel. –

+8

Vergessen Sie nicht, dass die Doppelpunkte ein untrennbarer Teil des Selektors sind. @selector (catFish) unterscheidet sich vollständig von @selector (catFish :). – Chuck

+0

hey gibt es eine Möglichkeit, etwas Ähnliches für Immobilien zu tun? Wenn ich ein generisches ID-Element habe, das ich aus einem Array gezogen habe, möchte ich wissen, ob es eine bestimmte Eigenschaft hat ... – topwik

5

Blick auf NSObject der respondsToSelector Methode

1

Eine schöne allgemeine Kategorie in Ihrem Code haben, ist dies:

@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 

Und dann können Sie verwenden:

[element performSelectorIfResponds:@selector(lowercaseString)]; 
Verwandte Themen