2009-02-11 8 views
182

Ich möchte überprüfen, ob ein Objekt (z. B. someObject) zu einer Variablen eines anderen Typs (z. B. SpecifiedType) zuweisbar (Cast-fähig) ist. In Java kann ich schreiben:In Objective-C entspricht das Java-Schlüsselwort "instanceof"?

Eine verwandte Frage ist, ob der Laufzeittyp eines Objekts gleich einem anderen Typ ist. In Java kann ich schreiben:

someObject.getClass().equals(SpecifiedType.class) 

Wie kann dies in Objective-C getan werden?

+0

Siehe auch: http://stackoverflow.com/q/8294076/165674 –

Antwort

251

Versuchen Sie [myObject class] für die Rückgabe der Klasse eines Objekts.

können Sie genaue Vergleiche mit:

if ([myObject class] == [MyClass class]) 

aber nicht direkt MyClass Kennung verwenden.

In ähnlicher Weise können Sie feststellen, ob das Objekt einer Unterklasse der Klasse ist mit:

if ([myObject isKindOfClass:[AnObject class]]) 

wie von Jon Skeet und Zoul vorgeschlagen.

+0

Wie würde ich nachsehen? Gleichheit mit einem Objekt vom Typ "AnObject" zum Beispiel? – Dimitris

+0

"if ([myObject class] == [AnObject class])" oder, wie von Jon Skeet und zoul vorgeschlagen: "if ([myObject isKindOfClass: [AnObject class]])" – mouviciel

+7

exakter Vergleich kann auch mit 'if durchgeführt werden ([myObject isMemberOfClass: [MyClass-Klasse]]) ' – user102008

37

Von Wikipedia:

In Objective-C, beispielsweise sowohl die generic Object und NSObject (in Cocoa/Openstep) liefern das Verfahren isMemberOfClass: die true wenn das Argument der Methode zurückgibt ist eine Instanz der angegebenen Klasse. Die Methode isKindOfClass: analog gibt true zurück, wenn das Argument von der angegebenen Klasse erbt.

isKindOfClass: wäre am nächsten zu instanceof, durch die Geräusche davon.

8

Siehe die isKindOfClass: Methode in der NSObject Dokumentation. (Das übliche Wort der Warnung für eine solche Frage ist, dass das Überprüfen der Objektklasse oft ein Zeichen dafür ist, etwas falsch zu machen.)

+2

Kopieren Sie einfach von der" Antwort "unten:" @Zoul - warum wird die Klassenprüfung als schlecht angesehen? Ist das nicht eine gute defensive Programmierung oder argumentieren Sie, dass es unnötig sein sollte? " –

+1

Aha, danke. Ein Problem besteht darin, dass Objekte nicht von der Klasse sein müssen, die Sie erwarten. Während des Tests ist es üblich, einen Klassen-Stub zu übergeben, der die Schnittstelle berücksichtigt, aber eine andere Klasse hat. Oder wenn Sie Wertänderungen mit KVO beobachten, wird mit den Klassen eine gewisse Magie ausgeführt. Beide Fälle sind ziemlich legitim und beide können leicht beschädigt werden, wenn Ihr Code explizite Klassenprüfungen durchführt. Schaltverhalten in der Klasse ist schlecht OO-Design, eng gekoppelt und schwer zu erweitern. Ich sage nicht, dass es keinen legitimen Anwendungsfall für Klassenkontrollen gibt, aber Sie sollten zweimal darüber nachdenken, bevor Sie es tun. – zoul

+0

@Zoul In diesem speziellen Fall wäre das einfach nur Unerfahrenheit, man würde eher '+ (BOOL) konform zu Protocol: (Protocol *) aProtocol' verwenden. – EricLeaf