Wie teste ich in Objective-C den Objekttyp?


Antworten:


880

Wenn Ihr Objekt ist myObjectund Sie testen möchten, ob es ein Objekt ist , lautet NSStringder Code:

[myObject isKindOfClass:[NSString class]]

Ebenso, wenn Sie auf Folgendes testen myObjectmöchten UIImageView:

[myObject isKindOfClass:[UIImageView class]]

90
Beachten Sie, dass es auch eine isMemberOfClass: -Methode gibt, die die Genauigkeit der Klasse überprüft. Seien Sie jedoch vorsichtig, da es sich bei vielen Apple-Objekten tatsächlich um getarnte Core Foundation-Typen handelt. (ZB ist ein NSString häufiger ein NSCFString und isMemberOfClass: gibt für diesen Vergleich false zurück.)
Craig Otis

3
Beachten Sie, dass diese Methode sehr langsam ist!
SAKrisT

Ist das richtig zu wissen, dass NSString ein Klassencluster ist? (wie NSNumber)
Ricardo

52

Sie würden wahrscheinlich verwenden

- (BOOL)isKindOfClass:(Class)aClass

Dies ist eine Methode von NSObject.

Weitere Informationen finden Sie in der NSObjectDokumentation.

So verwenden Sie dies.

BOOL test = [self isKindOfClass:[SomeClass class]];

Sie könnten auch versuchen, so etwas zu tun

for(id element in myArray)
{
    NSLog(@"=======================================");
    NSLog(@"Is of type: %@", [element className]);
    NSLog(@"Is of type NSString?: %@", ([[element className] isMemberOfClass:[NSString class]])? @"Yes" : @"No");
    NSLog(@"Is a kind of NSString: %@", ([[element classForCoder] isSubclassOfClass:[NSString class]])? @"Yes" : @"No");    
}

4
-1: Nicht verwenden className, es kann unter OS X funktionieren oder nicht, aber es ist nicht in iOS und es ist nicht dafür gedacht. Außerdem NSLogtun diese nicht das, was Sie meiner Meinung nach gemeint haben - sie überprüfen seltsamerweise den Klassennamen (immer eine Zeichenfolge) und die Codiererklasse anstelle der Klasse des eigentlichen Elements.
andyvn22

5
Für eine schnelle Überprüfung dies: NSLog(@"Is of type: %@", [element class]); funktioniert in iOS 7
Portland Runner

1
@PortlandRunner: Genau das habe ich gesucht. IDK, wenn es ein Ticket gibt, das genau das besser anspricht, aber wenn nicht, sollten Sie eines erstellen. Wenn Sie dies tun, lasse ich es mich wissen und ich werde die Antwort dort positiv bewerten, da dieser Ausschnitt für mich eine Clutch war. Danke noch einmal.
Matt Williams

15

Wenn Sie zwischen einer Superklasse und der geerbten Klasse unterscheiden möchten, können Sie Folgendes verwenden:

if([myTestClass class] == [myInheritedClass class]){
   NSLog(@"I'm the inheritedClass);
} 
if([myTestClass class] == [mySuperClass class]){
   NSLog(@"I'm the superClass);
} 

Die Verwendung - (BOOL)isKindOfClass:(Class)aClassin diesem Fall würde beide Male zu TRUE führen, da die inheritedClass auch eine Art SuperClass ist.


3
isMemberOfClass:wird NObeim Umgang mit Unterklassen zurückkehren.
Mipadi

11

Bei einem einfachen Test dachte ich, ich würde dokumentieren, was funktioniert und was nicht. Oft sehe ich Leute, die prüfen, ob die Klasse des Objekts Mitglied der anderen Klasse ist oder der anderen Klasse entspricht.

Für die folgende Zeile haben wir einige schlecht geformte Daten, die ein NSArray, ein NSDictionaryoder sein können (null).

NSArray *hits = [[[myXML objectForKey: @"Answer"] objectForKey: @"hits"] objectForKey: @"Hit"];

Dies sind die Tests, die durchgeführt wurden:

NSLog(@"%@", [hits class]);

if ([hits isMemberOfClass:[NSMutableArray class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isMemberOfClass:[NSMutableDictionary class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isMemberOfClass:[NSArray class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isMemberOfClass:[NSDictionary class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isKindOfClass:[NSMutableDictionary class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isKindOfClass:[NSDictionary class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isKindOfClass:[NSArray class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isKindOfClass:[NSMutableArray class]]) {
    NSLog(@"%@", [hits class]);
}

isKindOfClassfunktionierte ziemlich gut, während isMemberOfClassnicht.


Ich sehe, Sie haben Code für Tests freigegeben. Aber wo ist das gedruckte Ergebnis?
Nuynait

Die Idee ist, dass Sie meinen Code kopieren und die Ergebnisse für das sehen, was Sie brauchen.
Alex Zavatone

9

Sie können den folgenden Code verwenden, falls Sie die Typen primitiver Datentypen überprüfen möchten.

// Returns 0 if the object type is equal to double
strcmp([myNumber objCType], @encode(double)) 

5

Einfach, [Ihre Objektklasse] gibt den Klassennamen Ihres Objekts zurück.


1
Tatsächlich wird ein ClassObjekt zurückgegeben. Das descriptionObjekt dieses Objekts ist jedoch der Klassenname als Zeichenfolge, sodass Sie ihn weiterhin in der Konsole protokollieren können.
Devios1
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.