Ich muss testen, ob das Objekt vom Typ NSString
oder ist UIImageView
. Wie kann ich das erreichen? Gibt es eine Art "Isoftype" -Methode?
Ich muss testen, ob das Objekt vom Typ NSString
oder ist UIImageView
. Wie kann ich das erreichen? Gibt es eine Art "Isoftype" -Methode?
Antworten:
Wenn Ihr Objekt ist myObject
und Sie testen möchten, ob es ein Objekt ist , lautet NSString
der Code:
[myObject isKindOfClass:[NSString class]]
Ebenso, wenn Sie auf Folgendes testen myObject
möchten UIImageView
:
[myObject isKindOfClass:[UIImageView class]]
Sie würden wahrscheinlich verwenden
- (BOOL)isKindOfClass:(Class)aClass
Dies ist eine Methode von NSObject
.
Weitere Informationen finden Sie in der NSObject
Dokumentation.
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");
}
className
, es kann unter OS X funktionieren oder nicht, aber es ist nicht in iOS und es ist nicht dafür gedacht. Außerdem NSLog
tun 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.
NSLog(@"Is of type: %@", [element class]);
funktioniert in iOS 7
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)aClass
in diesem Fall würde beide Male zu TRUE führen, da die inheritedClass auch eine Art SuperClass ist.
isMemberOfClass:
wird NO
beim Umgang mit Unterklassen zurückkehren.
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 NSDictionary
oder 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]);
}
isKindOfClass
funktionierte ziemlich gut, während isMemberOfClass
nicht.
[object isKindOfClass:[ClassName class]]