В Objective-C, как я могу проверить тип объекта?

498

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

Теги:

7 ответов

797
Лучший ответ

Если ваш объект myObject, и вы хотите проверить, является ли это NSString, код будет выглядеть следующим образом:

[myObject isKindOfClass:[NSString class]]

Аналогично, если вы хотите протестировать myObject для UIImageView:

[myObject isKindOfClass:[UIImageView class]]
  • 85
    Обратите внимание, что есть также isMemberOfClass: метод, который будет проверять класс «точность». Будьте осторожны с этим, поскольку многие объекты Apple на самом деле являются скрытыми типами Core Foundation. (Например, NSString чаще всего является NSCFString, и isMemberOfClass: вернет false для этого сравнения.)
  • 3
    Обратите внимание, что этот метод очень медленный!
Показать ещё 2 комментария
54

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

- (BOOL)isKindOfClass:(Class)aClass

Это метод NSObject.

Подробнее см. документацию NSObject.

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

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

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

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
    да нет такого
Показать ещё 3 комментария
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 в этом случае приведет к TRUE оба раза, потому что inheritedClass также является своего рода суперклассом.

  • 2
    isMemberOfClass: вернет NO при работе с подклассами.
10

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

В приведенной ниже строке мы имеем несколько плохо сформированных данных, которые могут быть 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 не выполнял.

  • 0
    Я вижу, вы поделились кодом для тестов. Но где же напечатан результат?
  • 0
    Идея в том, чтобы вы скопировали мой код и увидели результаты для того, что вам нужно.
6

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

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

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

  • 1
    На самом деле он вернет объект Class . Однако description этого объекта будет именем класса в виде строки, поэтому вы все равно можете зарегистрировать его в консоли.
-1

С Swift 2.0 вы можете использовать только оператор is;

if myVariable is kindOfClass {
...
}

Например, вы ищете тип UITextView и узнаете, какой индекс в ваших представлениях выглядит таким образом:

for subView in view.subviews where subView is UITextView {
    ...
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню