Мені потрібно перевірити, чи є об’єкт типу 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]]