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

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

вопрос задан 17.07.2009
James Skidmore
23800 репутация

6 ответов


  • 829 рейтинг

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

    [myObject isKindOfClass:[NSString class]]
    

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

    [myObject isKindOfClass:[UIImageView class]]
    
    ответ дан mmc, с репутацией 16102, 17.07.2009
  • 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");    
    }
    
    ответ дан Bryan Hare, с репутацией 649, 17.07.2009
  • 12 рейтинг

    Если вы хотите различать суперкласс и унаследованный класс, вы можете использовать:

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

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

    ответ дан Yedy, с репутацией 1783, 13.08.2013
  • 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 - нет.

    ответ дан Alex Zavatone, с репутацией 2285, 8.10.2012
  • 6 рейтинг

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

    // Returns 0 if the object type is equal to double
    strcmp([myNumber objCType], @encode(double)) 
    
    ответ дан Bajju, с репутацией 593, 8.05.2014
  • 4 рейтинг

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

    ответ дан AMohan, с репутацией 444, 14.05.2014