webentwicklung-frage-antwort-db.com.de

Wie teste ich in Objective-C den Objekttyp?

Ich muss testen, ob das Objekt vom Typ NSString oder UIImageView ist. Wie kann ich das erreichen? Gibt es eine Art "Isoftype" -Methode?

543
James Skidmore

Wenn Ihr Objekt myObject ist und Sie testen möchten, ob es ein NSString ist, lautet der Code:

[myObject isKindOfClass:[NSString class]]

Ebenso, wenn Sie myObject auf UIImageView testen wollten:

[myObject isKindOfClass:[UIImageView class]]
856
mmc

Sie würden wahrscheinlich verwenden

- (BOOL)isKindOfClass:(Class)aClass

Dies ist eine Methode von NSObject.

Weitere Informationen finden Sie in der Dokumentation zu NSObject.

So verwenden Sie das.

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

Wenn Sie zwischen einer superClass und der inheritedClass 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 von - (BOOL)isKindOfClass:(Class)aClass würde in diesem Fall beide Male zu TRUE führen, da die inheritedClass auch eine Art der superClass ist.

15
Yedy

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 ein Mitglied der anderen Klasse ist oder der anderen Klasse entspricht.

Für die folgende Zeile liegen einige schlecht geformte Daten vor, die ein NSArray, ein NSDictionary oder ein (null) sein können.

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 hat ziemlich gut funktioniert, isMemberOfClass nicht.

11
Alex Zavatone

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

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

Ganz einfach, [yourobject class] gibt den Klassennamen Ihres Objekts zurück.

5
AMohan