2009-07-17 14 views
507

Devo verificare se l'oggetto è di tipo NSString o UIImageView. Come posso realizzare questo? Esiste un tipo di metodo "isoftype"?In Objective-C, come si verifica il tipo di oggetto?

+0

Vedere: [In Objective-C qual è l'elemento equivalente della parola chiave "instanceof" java?] (Http://stackoverflow.com/questions/536396/in-objective-c-what-is-the-equivelant- of-the-java-instanceof-keyword) – Reunanen

+31

Sì, c'è: '[object isKindOfClass: [ClassName class]]' –

risposta

813

Se l'oggetto è myObject, e si desidera verificare se si tratta di un NSString, il codice sarebbe:

[myObject isKindOfClass:[NSString class]] 

Allo stesso modo, se si voleva testare myObject per un UIImageView:

[myObject isKindOfClass:[UIImageView class]] 
+80

Nota che esiste anche un isMemberOfClass: metodo che controlla la "precisione" della classe. Fai attenzione, però, dato che molti oggetti Apple sono in realtà tipi di Core Foundation travestiti. Ad esempio, una NSString è più spesso una NSCFString e isMemberOfClass: restituirà false per questo confronto.) –

+2

Nota questo metodo è molto lento! – SAKrisT

+0

È giusto sapere che NSString è un cluster di classi? (come NSNumber) – Ricardo

53

Si sarebbe probabilmente utilizzare

- (BOOL)isKindOfClass:(Class)aClass 

Questo è un metodo di NSObject.

Per ulteriori informazioni, consultare la documentazione NSObject.

Ecco come lo si utilizza.

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

Si potrebbe anche provare a fare somthing come questo

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

cos'è questo 'className' Non riesco a farlo funzionare con i miei id –

+4

sì non c'è nulla di simile –

+4

-1: non usare' className', potrebbe non funzionare su OS X, ma non è in iOS e non è pensato per essere usato per questo. Inoltre, quegli 'NSLog' non fanno quello che penso tu intendessi per loro - stanno controllando il nome della classe (sempre una stringa) e la classe coder, stranamente, invece della classe dell'elemento reale. – andyvn22

11

Esecuzione di un semplice test, ho pensato di documentare che cosa funziona e cosa no. Spesso vedo persone che controllano se la classe dell'oggetto è membro dell'altra classe o uguale all'altra classe.

Per la riga di seguito, abbiamo alcuni dati mal formati che possono essere un NSArray, uno NSDictionary o (null).

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

Queste sono le prove che sono state eseguite:

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 ha funzionato piuttosto bene, mentre isMemberOfClass no.

12

Quando si desidera differire da una superclasse ed l'inheritedClass è possibile utilizzare:

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

Utilizzando - (BOOL)isKindOfClass:(Class)aClass in questo caso si tradurrebbe in VERO entrambe le volte perché l'inheritedClass è anche una sorta di superclasse.

+2

'isMemberOfClass:' restituirà 'NO' quando si ha a che fare con sottoclassi. – mipadi

6

È possibile utilizzare il seguente codice in caso si desideri verificare i tipi di tipi di dati primitivi.

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

Semplice, [classe yourobject] restituirà il nome classe di yourobject.

+1

In realtà restituirà un oggetto 'Class'. Tuttavia, la 'description' di questo oggetto sarà il nome della classe come una stringa, quindi è possibile quindi registrarlo sulla console. – devios1

Problemi correlati