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

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

Ответ 1

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

[myObject isKindOfClass:[NSString class]]

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

[myObject isKindOfClass:[UIImageView class]]

Ответ 2

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

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

Ответ 3

Если вы хотите отличаться от суперкласса и 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 также является своего рода суперклассом.

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

if myVariable is kindOfClass {
...
}

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

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