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

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

6 ответов


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

[myObject isKindOfClass:[NSString class]]

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

[myObject isKindOfClass:[UIImageView class]]

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

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

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

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


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

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


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

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

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