Мне нужно проверить, имеет ли объект тип NSString или UIImageView. Как я могу это сделать? Существует ли какой-либо тип метода "isoftype"?
В Objective-C, как я могу проверить тип объекта?
Ответ 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 {
    ...
}
