Мне нужно проверить, является ли объект типа NSString
или UIImageView
. Как я могу сделать это? Есть какой-то тип метода "isoftype"?
Мне нужно проверить, является ли объект типа NSString
или UIImageView
. Как я могу сделать это? Есть какой-то тип метода "isoftype"?
Ответы:
Если ваш объект есть 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");
}
className
, он может работать или не работать в OS X, но не в iOS и не предназначен для этого. Кроме того, NSLog
они не делают то, что, как я думаю, вы имели в виду - они проверяют имя класса (всегда строка) и класс кодера, как ни странно, вместо класса фактического элемента.
NSLog(@"Is of type: %@", [element class]);
будет работать в iOS 7
Если вы хотите различать суперкласс и унаследованный класс, вы можете использовать:
if([myTestClass class] == [myInheritedClass class]){
NSLog(@"I'm the inheritedClass);
}
if([myTestClass class] == [mySuperClass class]){
NSLog(@"I'm the superClass);
}
Использование - (BOOL)isKindOfClass:(Class)aClass
в этом случае приведет к ИСТИНАМ оба раза, потому что наследованный класс также является разновидностью суперкласса.
isMemberOfClass:
вернется NO
при работе с подклассами.
Запустив простой тест, я решил документировать, что работает, а что нет. Часто я вижу людей, проверяющих, является ли класс объекта членом другого класса или равен другому классу.
Для строки ниже у нас есть некоторые плохо сформированные данные, которые могут быть 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
нет.
[object isKindOfClass:[ClassName class]]