Wie teste ich, ob ein Objekt eine Instanz einer bestimmten Klasse in Objective-C ist? Angenommen, ich möchte sehen, ob Objekt a eine Instanz der Klasse b oder der Klasse c ist. Wie gehe ich vor?
Wie teste ich, ob ein Objekt eine Instanz einer bestimmten Klasse in Objective-C ist? Angenommen, ich möchte sehen, ob Objekt a eine Instanz der Klasse b oder der Klasse c ist. Wie gehe ich vor?
Antworten:
So testen Sie, ob das Objekt eine Instanz der Klasse a ist:
[yourObject isKindOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of
// given class or an instance of any class that inherits from that class.
oder
[yourObject isMemberOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of a
// given class.
Um den Klassennamen des Objekts abzurufen, können Sie die folgende NSStringFromClass
Funktion verwenden:
NSString *className = NSStringFromClass([yourObject class]);
oder c-Funktion von Objective-C Runtime API:
#import <objc/runtime.h>
/* ... */
const char* className = class_getName([yourObject class]);
NSLog(@"yourObject is a: %s", className);
EDIT: In Swift
if touch.view is UIPickerView {
// touch.view is of type UIPickerView
}
class_getName
gegenüber NSStringFromClass
? Wenn es keine gibt, sollte diese Antwort angepasst werden.
Sie können auch verwenden
NSString *className = [[myObject class] description];
auf jedem NSObject
Was bedeutet isKindOfClass in der Apple-Dokumentation ?
Seien Sie vorsichtig, wenn Sie diese Methode für Objekte verwenden, die von einem Klassencluster dargestellt werden. Aufgrund der Art der Klassencluster entspricht das Objekt, das Sie zurückerhalten, möglicherweise nicht immer dem Typ, den Sie erwartet haben. Wenn Sie eine Methode aufrufen, die einen Klassencluster zurückgibt, ist der genaue Typ, den die Methode zurückgibt, der beste Indikator dafür, was Sie mit diesem Objekt tun können. Wenn eine Methode beispielsweise einen Zeiger auf ein NSArray-Objekt zurückgibt, sollten Sie diese Methode nicht verwenden, um festzustellen, ob das Array veränderbar ist, wie im folgenden Code gezeigt:
// DO NOT DO THIS!
if ([myArray isKindOfClass:[NSMutableArray class]])
{
// Modify the object
}
Wenn Sie solche Konstrukte in Ihrem Code verwenden, denken Sie möglicherweise, dass es in Ordnung ist, ein Objekt zu ändern, das in Wirklichkeit nicht geändert werden sollte. Dies kann dann zu Problemen für anderen Code führen, der erwartet, dass das Objekt unverändert bleibt.
-isKindOfClass:
& -isMemberOfClass:
nicht zum Identifizieren von Objekten innerhalb eines Klassenclusters verwendet werden sollte.
Wenn Sie nach einer bestimmten Klasse suchen möchten, können Sie verwenden
if([MyClass class] == [myClassObj class]) {
//your object is instance of MyClass
}
Wenn Sie den Namen der Klasse erhalten möchten, rufen Sie einfach an: -
id yourObject= [AnotherClass returningObject];
NSString *className=[yourObject className];
NSLog(@"Class name is : %@",className);