Muszę sprawdzić, czy obiekt jest typu NSString
czy UIImageView
. Jak mogę to osiągnąć? Czy istnieje jakiś rodzaj metody „izoftype”?
Muszę sprawdzić, czy obiekt jest typu NSString
czy UIImageView
. Jak mogę to osiągnąć? Czy istnieje jakiś rodzaj metody „izoftype”?
Odpowiedzi:
Jeśli Twoim obiektem jest myObject
, a chcesz przetestować, czy jest to NSString
, kod będzie:
[myObject isKindOfClass:[NSString class]]
Podobnie, jeśli chcesz przetestować myObject
dla UIImageView
:
[myObject isKindOfClass:[UIImageView class]]
Prawdopodobnie byś użył
- (BOOL)isKindOfClass:(Class)aClass
To jest metoda NSObject
.
Aby uzyskać więcej informacji, sprawdź NSObject
dokumentację.
Tak to wykorzystujesz.
BOOL test = [self isKindOfClass:[SomeClass class]];
Możesz także spróbować zrobić coś takiego
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
, może działać lub nie w systemie OS X, ale nie ma go w systemie iOS i nie jest przeznaczony do tego. Ponadto, NSLog
nie robią tego, co myśleliście, że mieliście na myśli - sprawdzają nazwę klasy (zawsze łańcuch) i, o dziwo, klasę kodera, zamiast klasy rzeczywistego elementu.
NSLog(@"Is of type: %@", [element class]);
będzie działać w iOS 7
Jeśli chcesz różnić się między klasą superClass a dziedziczoną klasą, możesz użyć:
if([myTestClass class] == [myInheritedClass class]){
NSLog(@"I'm the inheritedClass);
}
if([myTestClass class] == [mySuperClass class]){
NSLog(@"I'm the superClass);
}
Użycie - (BOOL)isKindOfClass:(Class)aClass
w tym przypadku spowoduje PRAWDA za każdym razem, ponieważ dziedziczona klasa jest również rodzajem superklasy.
isMemberOfClass:
powróci w NO
przypadku podklas.
Przeprowadzając prosty test, pomyślałem, że udokumentuję, co działa, a co nie. Często widzę ludzi sprawdzających, czy klasa obiektu jest członkiem innej klasy, czy jest równa drugiej klasie.
W poniższym wierszu mamy kilka źle sformułowanych danych, które mogą być an NSArray
, an NSDictionary
lub (null)
.
NSArray *hits = [[[myXML objectForKey: @"Answer"] objectForKey: @"hits"] objectForKey: @"Hit"];
Oto testy, które zostały przeprowadzone:
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
działał raczej dobrze, a isMemberOfClass
nie.
[object isKindOfClass:[ClassName class]]