2009-07-17 14 views
507

Muszę sprawdzić, czy obiekt jest typu NSString lub UIImageView. Jak mogę to zrobić? Czy istnieje jakiś rodzaj metody "isoftype"?W Objective-C, jak przetestować typ obiektu?

+0

Zobacz: [W Objective-C czym jest equivelant słowa kluczowego "instanceof" java?] (Http://stackoverflow.com/questions/536396/in-objective-c-what-is-the-equivelant- z-the-java-instanceof-keyword) – Reunanen

+31

Tak, istnieje: '[object isKindOfClass: [ClassName class]]' –

Odpowiedz

813

Jeśli obiekt jest myObject i chcesz przetestować, aby sprawdzić, czy jest to NSString, kod byłoby:

[myObject isKindOfClass:[NSString class]] 

Podobnie, jeśli chcesz przetestować myObject dla UIImageView:

[myObject isKindOfClass:[UIImageView class]] 
+80

Zauważ, że istnieje również metoda isMemberOfClass:, która sprawdzi, czy klasa jest "dokładnością". Należy jednak zachować ostrożność, ponieważ wiele obiektów Apple jest w przebraniu typu Core Foundation. (Np. NSString jest częściej NSCFString, a isMemberOfClass: zwróci false dla tego porównania.) –

+2

Uwaga ta metoda jest bardzo powolna! – SAKrisT

+0

Czy to prawda, wiedząc, że NSString to klaster klasy? (jak NSNumber) – Ricardo

53

pewnie można użyć

- (BOOL)isKindOfClass:(Class)aClass 

To jest metoda z NSObject.

Aby uzyskać więcej informacji, zapoznaj się z dokumentacją NSObject.

Oto jak tego używasz.

BOOL test = [self isKindOfClass:[SomeClass class]]; 

Można też spróbować zrobić somthing jak ten

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");  
} 
+2

co to jest 'className' Nie mogę uzyskać pracy z moimi identyfikatorami –

+4

tak nie ma czegoś takiego –

+4

-1: Nie używaj' className', to może lub nie działać na OS X, ale nie ma go iOS i nie jest przeznaczony do tego celu. Ponadto te 'NSLog's nie robią tego, co moim zdaniem miałeś na myśli - sprawdzają nazwę klasy (zawsze ciąg) i klasę kodera, co dziwne, zamiast klasy rzeczywistego elementu. – andyvn22

11

Running prosty test, pomyślałem, że dokument, co działa a co nie. Często widzę, że ludzie sprawdzają, czy klasa obiektu jest członkiem innej klasy lub jest równa drugiej klasie.

Na poniższej linii, mamy pewne dane, które słabo uformowanych może być NSArray An NSDictionary lub (null).

NSArray *hits = [[[myXML objectForKey: @"Answer"] objectForKey: @"hits"] objectForKey: @"Hit"]; 

Są to testy, które przeprowadzono:

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 pracował dość dobrze podczas isMemberOfClass nie.

12

Kiedy chcesz się różnią między nadklasą i inheritedClass można użyć:

if([myTestClass class] == [myInheritedClass class]){ 
    NSLog(@"I'm the inheritedClass); 
} 
if([myTestClass class] == [mySuperClass class]){ 
    NSLog(@"I'm the superClass); 
} 

Korzystanie - (BOOL)isKindOfClass:(Class)aClass w tym przypadku spowoduje to zarówno razy, ponieważ inheritedClass jest również rodzajem nadklasy.

+2

'isMemberOfClass:' zwróci 'NIE' przy kontaktach z podklasami. – mipadi

6

Możesz użyć następującego kodu, pod którym chcesz sprawdzić typy pierwotnych typów danych.

// Returns 0 if the object type is equal to double 
strcmp([myNumber objCType], @encode(double)) 
4

Prosta, [klasa yourobject] zwróci nazwę klasy yourobject.

+1

W rzeczywistości zwróci obiekt "Class". Jednak "opis" tego obiektu będzie nazwą klasy jako ciągiem znaków, dzięki czemu można w dalszym ciągu logować ją do konsoli. – devios1

Powiązane problemy