Как проверить, является ли объект экземпляром определенного класса в Objective-C? Допустим, я хочу посмотреть, является ли объект a экземпляром класса b или класса c, как мне это сделать?
Как проверить, является ли объект экземпляром определенного класса в Objective-C? Допустим, я хочу посмотреть, является ли объект a экземпляром класса b или класса c, как мне это сделать?
Ответы:
Чтобы проверить, является ли объект экземпляром класса 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.
или
[yourObject isMemberOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of a
// given class.
Чтобы получить имя класса объекта, вы можете использовать NSStringFromClass
функцию:
NSString *className = NSStringFromClass([yourObject class]);
или c-function из API-интерфейса target-c:
#import <objc/runtime.h>
/* ... */
const char* className = class_getName([yourObject class]);
NSLog(@"yourObject is a: %s", className);
РЕДАКТИРОВАТЬ: В Swift
if touch.view is UIPickerView {
// touch.view is of type UIPickerView
}
class_getName
над NSStringFromClass
? Если его нет, этот ответ следует скорректировать.
Вы также можете использовать
NSString *className = [[myObject class] description];
на любом NSObject
Что значит про isKindOfClass в документации Apple
Будьте осторожны при использовании этого метода на объектах, представленных кластером классов. Из-за природы кластеров классов возвращаемый объект может не всегда соответствовать ожидаемому типу. Если вы вызываете метод, который возвращает кластер классов, точный тип, возвращаемый методом, является лучшим индикатором того, что вы можете сделать с этим объектом. Например, если метод возвращает указатель на объект NSArray, вы не должны использовать этот метод, чтобы увидеть, является ли массив изменчивым, как показано в следующем коде:
// DO NOT DO THIS!
if ([myArray isKindOfClass:[NSMutableArray class]])
{
// Modify the object
}
Если вы используете такие конструкции в своем коде, вы можете подумать, что можно модифицировать объект, который в действительности не должен изменяться. Это может создать проблемы для другого кода, который ожидает, что объект останется неизменным.
-isKindOfClass:
& -isMemberOfClass:
не следует использовать для идентификации объектов в кластере классов.
Если вы хотите проверить определенный класс, вы можете использовать
if([MyClass class] == [myClassObj class]) {
//your object is instance of MyClass
}
если вы хотите получить имя класса, просто позвоните:
id yourObject= [AnotherClass returningObject];
NSString *className=[yourObject className];
NSLog(@"Class name is : %@",className);