Jak sprawdzić, czy obiekt jest instancją określonej klasy w Objective-C? Powiedzmy, że chcę zobaczyć, czy obiekt a jest instancją klasy b lub klasy c, jak mam to zrobić?
Jak sprawdzić, czy obiekt jest instancją określonej klasy w Objective-C? Powiedzmy, że chcę zobaczyć, czy obiekt a jest instancją klasy b lub klasy c, jak mam to zrobić?
Odpowiedzi:
Aby sprawdzić, czy obiekt jest instancją klasy a:
[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.
lub
[yourObject isMemberOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of a
// given class.
Aby uzyskać nazwę klasy obiektu, możesz użyć NSStringFromClass
funkcji:
NSString *className = NSStringFromClass([yourObject class]);
lub funkcja c z interfejsu API w czasie wykonywania celu-c:
#import <objc/runtime.h>
/* ... */
const char* className = class_getName([yourObject class]);
NSLog(@"yourObject is a: %s", className);
EDYCJA: W Swift
if touch.view is UIPickerView {
// touch.view is of type UIPickerView
}
class_getName
z NSStringFromClass
? Jeśli nie ma, odpowiedź należy dostosować.
Możesz także użyć
NSString *className = [[myObject class] description];
na dowolnym obiekcie NSObject
Co oznacza o isKindOfClass w dokumentacji Apple
Zachowaj ostrożność podczas korzystania z tej metody na obiektach reprezentowanych przez klaster klas. Ze względu na naturę klastrów klas odzyskany obiekt może nie zawsze być zgodny z oczekiwaniami. W przypadku wywołania metody zwracającej klaster klas dokładny typ zwracany przez metodę jest najlepszym wskaźnikiem tego, co można zrobić z tym obiektem. Na przykład, jeśli metoda zwraca wskaźnik do obiektu NSArray, nie należy używać tej metody do sprawdzania, czy tablica jest modyfikowalna, jak pokazano w poniższym kodzie:
// DO NOT DO THIS!
if ([myArray isKindOfClass:[NSMutableArray class]])
{
// Modify the object
}
Jeśli użyjesz takich konstrukcji w swoim kodzie, możesz pomyśleć, że można modyfikować obiekt, który w rzeczywistości nie powinien być modyfikowany. Może to spowodować problemy z innym kodem, który oczekiwałby, że obiekt pozostanie niezmieniony.
-isKindOfClass:
i -isMemberOfClass:
nie powinny być wykorzystywane do identyfikacji obiektów w ramach klastra klasy.
Jeśli chcesz sprawdzić konkretną klasę, możesz użyć
if([MyClass class] == [myClassObj class]) {
//your object is instance of MyClass
}
jeśli chcesz uzyskać nazwę klasy, po prostu zadzwoń:
id yourObject= [AnotherClass returningObject];
NSString *className=[yourObject className];
NSLog(@"Class name is : %@",className);