Як перевірити, чи об'єкт є екземпляром певного класу в 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-функція від api об’єкта-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];
на будь-якому об'єкті NSO
Що означає про isKindOfClass в Apple Documentation
Будьте обережні при використанні цього методу на об'єктах, представлених кластерним класом. Через характер кластерних класів об'єкт, який ви повернете, не завжди може бути типом, який ви очікували. Якщо ви викликаєте метод, який повертає кластер класів, точний тип, який повертається методом, є найкращим показником того, що ви можете зробити з цим об’єктом. Наприклад, якщо метод повертає вказівник на об’єкт 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);