In Objective-C, come testare il tipo di oggetto?


Risposte:


880

Se il tuo oggetto è myObject, e vuoi testare per vedere se è un NSString, il codice sarebbe:

[myObject isKindOfClass:[NSString class]]

Allo stesso modo, se si desidera provare myObjectper un UIImageView:

[myObject isKindOfClass:[UIImageView class]]

90
Si noti che esiste anche un metodo isMemberOfClass: che verificherà la classe "esattezza". Fai attenzione, tuttavia, poiché molti oggetti Apple sono in realtà tipi di Core Foundation sotto mentite spoglie. (Ad esempio, una NSString è più spesso una NSCFString e isMemberOfClass: restituirà false per questo confronto.)
Craig Otis,

3
Nota che questo metodo è molto lento!
SAKrisT,

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

52

Probabilmente useresti

- (BOOL)isKindOfClass:(Class)aClass

Questo è un metodo di NSObject.

Per maggiori informazioni consulta la NSObjectdocumentazione.

Questo è come lo usi.

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

Potresti anche provare a fare qualcosa del genere

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

4
-1: non utilizzare className, potrebbe funzionare o meno su OS X, ma non è in iOS e non è destinato a questo scopo. Inoltre, quelli NSLognon fanno quello che penso tu intendessi dire loro - stanno controllando il nome della classe (sempre una stringa) e la classe del codificatore, stranamente, invece della classe dell'elemento reale.
andyvn22

5
Per un rapido controllo: NSLog(@"Is of type: %@", [element class]); funzionerà su iOS 7
Portland Runner,

1
@PortlandRunner: questo è esattamente quello che stavo cercando. IDK se esiste un ticket che risolve meglio la cosa esatta, ma in caso contrario dovresti crearne uno. Se lo fai, me lo faccio sapere e voterò la risposta lì, dato che questo frammento mi ha attaccato. Grazie ancora.
Matt Williams,

15

Quando vuoi differenziare tra una superClass e la ereditedClass puoi usare:

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

L'utilizzo - (BOOL)isKindOfClass:(Class)aClassin questo caso comporterebbe VERO entrambe le volte perché anche la ereditedClass è una specie di superClass.


3
isMemberOfClass:tornerà NOquando si ha a che fare con le sottoclassi.
mipadi,

11

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

Per la riga seguente, abbiamo alcuni dati scarsamente formati che possono essere un NSArray, un NSDictionaryo (null).

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

Questi sono i test che sono stati eseguiti:

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]);
}

isKindOfClassha funzionato piuttosto bene mentre isMemberOfClassnon lo ha fatto.


Vedo il tuo codice condiviso per i test. Ma dove sono i risultati stampati?
nuynait,

L'idea è di copiare il mio codice e vedere i risultati per quello che ti serve.
Alex Zavatone,

9

È possibile utilizzare il seguente codice se si desidera verificare i tipi di tipi di dati primitivi.

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

5

Semplice, [classe yourobject] restituirà il nome della classe del tuo oggetto.


1
In realtà restituirà un Classoggetto. Tuttavia, l' descriptionoggetto di questo sarà il nome della classe come una stringa, quindi è quindi possibile ancora registrarlo sulla console.
devios1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.