В 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))