2009-07-17 3 views
507

Мне нужно проверить, имеет ли объект тип NSString или UIImageView. Как я могу это сделать? Существует ли какой-либо тип метода «isoftype»?В Objective-C, как я могу проверить тип объекта?

+0

См. [В Objective-C, что является эквивалентом слова «instanceof» java? »(Http://stackoverflow.com/questions/536396/in-objective-c-what-is-the-equivelant- of-the-java-instanceof-keyword) – Reunanen

+31

Да, есть: '[object isKindOfClass: [ClassName class]]' –

ответ

813

Если ваш объект myObject, и вы хотите, чтобы проверить, чтобы увидеть, если это NSString, код будет:

[myObject isKindOfClass:[NSString class]] 

Точно так же, если вы хотите, чтобы проверить myObject для UIImageView:

[myObject isKindOfClass:[UIImageView class]] 
+80

Обратите внимание, что есть также isMemberOfClass: метод, который будет проверять точность класса. Будьте осторожны с этим, поскольку многие объекты Apple на самом деле являются основными типами Foundation Foundation. (Например, NSString чаще всего является NSCFString, а isMemberOfClass: возвращает false для этого сравнения.) –

+2

Обратите внимание, что этот метод очень медленный! – SAKrisT

+0

Правильно ли это, что NSString - кластер классов? (как NSNumber) – Ricardo

53

Вы бы, вероятно, использовать

- (BOOL)isKindOfClass:(Class)aClass 

Это метод NSObject.

Для получения дополнительной информации проверьте документацию NSObject.

Так вы используете это.

BOOL test = [self isKindOfClass:[SomeClass class]]; 

Вы также можете попробовать сделать Somthing как этот

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");  
} 
+2

Что это за 'className' Я не могу заставить его работать с моими идентификаторами –

+4

да нет такой вещи –

+4

-1: Не используйте' className', он может работать или не работать на OS X, но он не в iOS, и это не предназначено для этого. Кроме того, эти 'NSLog' не делают то, что, как я думаю, вы имели в виду, - они проверяют имя класса (всегда строку) и класс кодера, как ни странно, вместо класса фактического элемента. – andyvn22

11

Запуск простой тест, я думал, что документ, что работает, а что нет. Часто я вижу, что люди проверяют, является ли класс объекта членом другого класса или равен другому классу.

Для приведенной ниже строки мы имеем некоторые плохо сформированные данные, которые могут быть NSArray, NSDictionary или (null).

NSArray *hits = [[[myXML objectForKey: @"Answer"] objectForKey: @"hits"] objectForKey: @"Hit"]; 

Эти тесты, которые были выполнены:

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 работала достаточно хорошо, пока isMemberOfClass не сделал.

12

Если вы хотите, чтобы отличаться от суперкласса и inheritedClass вы можете использовать:

if([myTestClass class] == [myInheritedClass class]){ 
    NSLog(@"I'm the inheritedClass); 
} 
if([myTestClass class] == [mySuperClass class]){ 
    NSLog(@"I'm the superClass); 
} 

Использование - (BOOL)isKindOfClass:(Class)aClass в этом случае может привести к ИСТИНА как раз потому, что inheritedClass тоже своего рода суперкласса.

+2

'isMemberOfClass:' будет возвращать 'NO' при работе с подклассами. – mipadi

6

Вы можете использовать следующий код, чтобы проверить типы примитивных типов данных.

// Returns 0 if the object type is equal to double 
strcmp([myNumber objCType], @encode(double)) 
4

Простой, [класс yourobject] он вернет имя класса вашего объекта.

+1

На самом деле он вернет объект класса. Однако «описание» этого объекта будет именем класса в виде строки, поэтому вы можете, тем не менее, занести его в консоль. – devios1

Смежные вопросы