Jak w Objective-C mogę przetestować typ obiektu?

Odpowiedzi:

880

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]]
mmc
źródło
90
Zauważ, że istnieje również metoda isMemberOfClass: sprawdzająca klasę „dokładność”. Bądź jednak ostrożny, ponieważ wiele obiektów Apple jest w rzeczywistości typami Core Foundation w przebraniu. (Np. NSString jest częściej NSCFString, a isMemberOfClass: zwróci false dla tego porównania.)
Craig Otis
3
Uwaga: ta metoda jest bardzo wolna!
SAKrisT
Czy to prawda, wiedząc, że NSString jest klastrem klas? (jak NSNumber)
Ricardo
52

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");    
}
Bryan Hare
źródło
4
-1: Nie używaj 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.
andyvn22,
5
W celu szybkiego sprawdzenia: NSLog(@"Is of type: %@", [element class]); będzie działać w iOS 7
Portland Runner
1
@PortlandRunner: Właśnie tego szukałem. IDK, jeśli istnieje bilet, który lepiej odnosi się do tej rzeczy, ale jeśli nie, powinieneś go utworzyć. Jeśli to zrobisz, daj mi znać, a ja tam głosuję za odpowiedzią, ponieważ ten fragment był dla mnie ścisły. Dzięki jeszcze raz.
Matt Williams
15

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.

Tak
źródło
3
isMemberOfClass:powróci w NOprzypadku podklas.
mipadi
11

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.

Alex Zavatone
źródło
Widzę, że udostępniłeś kod do testów. Ale gdzie są wydrukowane wyniki?
nuynait
Chodzi o to, aby skopiować mój kod i zobaczyć wyniki, czego potrzebujesz.
Alex Zavatone
9

Możesz skorzystać z następującego kodu, aby sprawdzić typy prymitywnych typów danych.

// Returns 0 if the object type is equal to double
strcmp([myNumber objCType], @encode(double)) 
Bajju
źródło
5

Prosta [klasa twojego obiektu] zwróci nazwę klasy twojego obiektu.

AMohan
źródło
1
W rzeczywistości zwróci Classobiekt. Jednak descriptiontym obiektem będzie nazwa klasy jako ciąg znaków, dlatego nadal można go zalogować do konsoli.
devios1