578 Stimmen

Wie kann ich in Objective-C den Objekttyp testen?

Ich muss prüfen, ob das Objekt vom Typ NSString o UIImageView . Wie kann ich das bewerkstelligen? Gibt es eine Art von "isoftype"-Methode?

36 Stimmen

Ja, die gibt es: [object isKindOfClass:[ClassName class]]

912voto

mmc Punkte 17264

Wenn Ihr Objekt myObject und Sie möchten prüfen, ob es sich um eine NSString würde der Code lauten:

[myObject isKindOfClass:[NSString class]]

Ebenso, wenn Sie Folgendes testen wollten myObject für eine UIImageView :

[myObject isKindOfClass:[UIImageView class]]

93 Stimmen

Beachten Sie, dass es auch eine isMemberOfClass: Methode gibt, die die "Exaktheit" der Klasse überprüft. Seien Sie jedoch vorsichtig damit, da viele Apple-Objekte in Wirklichkeit verkleidete Core Foundation-Typen sind. (Z.B. ist ein NSString häufiger ein NSCFString, und isMemberOfClass: gibt bei diesem Vergleich false zurück).

4 Stimmen

Beachten Sie, dass diese Methode sehr langsam ist!

0 Stimmen

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

54voto

Bryan Hare Punkte 627

Sie würden wahrscheinlich Folgendes verwenden

- (BOOL)isKindOfClass:(Class)aClass

Dies ist eine Methode zur NSObject .

Weitere Informationen finden Sie auf der NSObject Dokumentation.

So verwenden Sie es.

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

Sie könnten auch Folgendes versuchen

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");    
}

5 Stimmen

-1: Nicht verwenden className Es kann unter OS X funktionieren oder auch nicht, aber es ist nicht in iOS und es ist nicht dafür gedacht, dafür verwendet zu werden. Auch die NSLog s tun nicht das, was ich denke, dass Sie sie gemeint haben - sie überprüfen den Klassennamen (immer eine Zeichenkette) und die Coder-Klasse, seltsamerweise, anstatt die Klasse des eigentlichen Elements.

6 Stimmen

Für einen schnellen Check dies: NSLog(@"Is of type: %@", [element class]); funktioniert unter iOS 7

2 Stimmen

@PortlandRunner : Das ist genau das, wonach ich gesucht habe. Ich weiß nicht, ob es ein Ticket gibt, das genau diese Sache besser behandelt, aber wenn nicht, sollten Sie eines erstellen. Wenn Sie das tun, lassen Sie es mich wissen, und ich werde die Antwort dort hochstufen, da dieses Snippet für mich die richtige Wahl war. Nochmals vielen Dank.

16voto

Yedy Punkte 2068

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

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

Verwendung von - (BOOL)isKindOfClass:(Class)aClass würde in diesem Fall beide Male TRUE ergeben, weil die inheritedClass auch eine Art der superClass ist.

5 Stimmen

isMemberOfClass: wird zurückgegeben NO beim Umgang mit Unterklassen.

14voto

Alex Zavatone Punkte 3855

Ich habe einen einfachen Test durchgeführt und wollte dokumentieren, was funktioniert und was nicht. Oft sehe ich Leute, die prüfen, ob die Klasse des Objekts ein Mitglied der anderen Klasse ist oder gleich der anderen Klasse ist.

Für die folgende Zeile haben wir einige schlecht geformte Daten, die ein Problem darstellen können. NSArray an NSDictionary o (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]);
}

isKindOfClass recht gut funktioniert, während isMemberOfClass hat nicht.

1 Stimmen

Wie ich sehe, haben Sie Code für Tests freigegeben. Aber wo sind die gedruckten Ergebnisse?

0 Stimmen

Die Idee ist, dass Sie meinen Code kopieren und die Ergebnisse sehen, die Sie brauchen.

11voto

Bajju Punkte 895

Sie können den folgenden Code verwenden, wenn Sie die Typen der primitiven Datentypen überprüfen möchten.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X