Was entspricht in Objective-C dem Schlüsselwort "instanceof" von Java?


185

Ich möchte prüfen, ob ein Objekt (zB someObject) einer Variablen eines anderen Typs (zB SpecifiedType) zuweisbar (umsetzbar ) ist. In Java kann ich schreiben:

someObject instanceof SpecifiedType

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

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

Wie kann dies in Objective-C durchgeführt werden?


Antworten:


264

Versuchen Sie [myObject class], die Klasse eines Objekts zurückzugeben.

Sie können genaue Vergleiche anstellen mit:

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

aber nicht durch direkte MyClassKennung.

Ebenso können Sie feststellen, ob das Objekt zu einer Unterklasse Ihrer Klasse gehört, mit:

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

wie von Jon Skeet und Zoul vorgeschlagen.


Wie würde ich beispielsweise mit einem Objekt vom Typ "AnObject" auf Gleichheit prüfen?
Dimitris

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

8
Ein genauer Vergleich ist auch möglich mitif ([myObject isMemberOfClass:[MyClass class]])
user102008

37

Aus Wikipedia :

In Objective-C stellen beispielsweise sowohl das generische Objectals auch NSObject(in Cocoa / OpenStep) die Methode bereit, die zurückgegeben wird isMemberOfClass:, truewenn das Argument für die Methode eine Instanz der angegebenen Klasse ist. Die Methode gibt isKindOfClass:analog true zurück, wenn das Argument von der angegebenen Klasse erbt.

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


9

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


2
Kopieren Sie einfach aus der "Antwort" unten: "@Zoul - warum wird die Verwendung der Klassentypprüfung als schlecht angesehen? Ist dies keine gute defensive Programmierung oder argumentieren Sie, dass dies unnötig sein sollte?"
Dan Rosenstark

1
Aha, danke. Ein Problem ist, dass Objekte nicht von der Klasse sein müssen, die Sie erwarten. Während des Testens ist es durchaus üblich, einen Klassenstub zu übergeben, der die Schnittstelle berücksichtigt, aber eine andere Klasse hat. Oder wenn Sie mit KVO Wertänderungen 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. Das Schaltverhalten in der Klasse ist ein schlechtes OO-Design, eng gekoppelt und schwer zu erweitern. Ich sage nicht, dass es keinen legitimen Anwendungsfall für Klassenprüfungen gibt, aber Sie sollten es sich zweimal überlegen, bevor Sie es tun.
Zoul

@zoul In diesem speziellen Fall wäre dies einfach nur Unerfahrenheit, man würde eher verwenden + (BOOL)conformsToProtocol:(Protocol *)aProtocol.
EricLeaf
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.