Мені потрібно перевірити, чи є об’єкт типу NSString
чи UIImageView
. Як я можу це досягти? Чи існує якийсь тип "ізотипового" методу?
Мені потрібно перевірити, чи є об’єкт типу NSString
чи UIImageView
. Як я можу це досягти? Чи існує якийсь тип "ізотипового" методу?
Відповіді:
Якщо ваш об’єкт є 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
при роботі з підкласами.
Проводячи простий тест, я подумав, що я задокументую, що працює, а що ні. Часто я бачу людей, які перевіряють, чи є клас об'єкта членом іншого класу чи рівний іншому класу.
Для рядка внизу ми маємо деякі неякісні дані, які можуть бути an 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
цього не робив.
[object isKindOfClass:[ClassName class]]