Muszę sprawdzić, czy obiekt jest typu NSStringczy UIImageView. Jak mogę to osiągnąć? Czy istnieje jakiś rodzaj metody „izoftype”?
Muszę sprawdzić, czy obiekt jest typu NSStringczy 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ć myObjectdla UIImageView:
[myObject isKindOfClass:[UIImageView class]]
Prawdopodobnie byś użył
- (BOOL)isKindOfClass:(Class)aClass
To jest metoda NSObject.
Aby uzyskać więcej informacji, sprawdź NSObjectdokumentację.
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, NSLognie 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)aClassw tym przypadku spowoduje PRAWDA za każdym razem, ponieważ dziedziczona klasa jest również rodzajem superklasy.
isMemberOfClass:powróci w NOprzypadku 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 NSDictionarylub (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]);
}
isKindOfClassdziałał raczej dobrze, a isMemberOfClassnie.
[object isKindOfClass:[ClassName class]]