В Objective-C, как я могу проверить тип объекта? - PullRequest
538 голосов
/ 17 июля 2009

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

Ответы [ 6 ]

848 голосов
/ 17 июля 2009

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

[myObject isKindOfClass:[NSString class]]

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

[myObject isKindOfClass:[UIImageView class]]
54 голосов
/ 17 июля 2009

Возможно, вы бы использовали

- (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");    
}
14 голосов
/ 13 августа 2013

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

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

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

11 голосов
/ 09 октября 2012

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

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

7 голосов
/ 08 мая 2014

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

// Returns 0 if the object type is equal to double
strcmp([myNumber objCType], @encode(double)) 
5 голосов
/ 14 мая 2014

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

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