Dans Objective-C, comment tester le type d'objet?

Réponses:

881

Si votre objet est myObject, et que vous souhaitez tester pour voir s'il s'agit d'un NSString, le code serait:

[myObject isKindOfClass:[NSString class]]

De même, si vous vouliez tester myObjectpour UIImageView:

[myObject isKindOfClass:[UIImageView class]]
mmc
la source
90
Notez qu'il existe également une méthode isMemberOfClass: qui vérifiera l'exactitude de la classe. Soyez prudent avec cela, car de nombreux objets Apple sont en fait des types de Core Foundation déguisés. (Par exemple, une chaîne NSString est plus souvent une chaîne NSCFS, et isMemberOfClass: renverra false pour cette comparaison.)
Craig Otis
3
Notez que cette méthode est très lente!
SAKrisT
Est-ce vrai de savoir que NSString est un cluster de classes? (comme NSNumber)
Ricardo
52

Vous utiliseriez probablement

- (BOOL)isKindOfClass:(Class)aClass

Ceci est une méthode de NSObject.

Pour plus d'informations, consultez la NSObjectdocumentation.

Voici comment vous l'utilisez.

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

Vous pourriez aussi essayer de faire quelque chose comme ça

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
la source
4
-1: Ne l'utilisez pas className, il peut ou non fonctionner sur OS X, mais ce n'est pas dans iOS et il n'est pas destiné à être utilisé pour cela. De plus, ces NSLogs ne font pas ce que je pense que vous vouliez dire - ils vérifient le nom de la classe (toujours une chaîne) et la classe du codeur, étrangement, au lieu de la classe de l'élément réel.
andyvn22
5
Pour une vérification rapide, cela NSLog(@"Is of type: %@", [element class]); fonctionnera dans iOS 7
Portland Runner
1
@PortlandRunner: C'est exactement ce que je cherchais. IDK s'il existe un ticket qui répond mieux à cette question, mais sinon, vous devez en créer un. Si vous le faites, je me le fais savoir et je vais voter là-dessus, car cet extrait était pour moi une pochette. Merci encore.
Matt Williams
15

Lorsque vous souhaitez faire la différence entre une superClass et la inheritedClass, vous pouvez utiliser:

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

L'utilisation - (BOOL)isKindOfClass:(Class)aClassdans ce cas se traduirait par TRUE les deux fois car la inheritedClass est également une sorte de superClass.

Yedy
la source
3
isMemberOfClass:reviendra NOlors du traitement des sous-classes.
mipadi
11

En exécutant un test simple, j'ai pensé documenter ce qui fonctionne et ce qui ne fonctionne pas. Souvent, je vois des gens vérifier si la classe de l'objet est membre de l'autre classe ou est égale à l'autre classe.

Pour la ligne ci-dessous, nous avons des données mal formées qui peuvent être un NSArray, un NSDictionaryou (null).

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

Ce sont les tests qui ont été effectués:

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

isKindOfClassa plutôt bien fonctionné, mais isMemberOfClasspas.

Alex Zavatone
la source
Je vois que vous avez partagé du code pour les tests. Mais où sont les résultats imprimés?
nuynait
L'idée est pour vous de copier mon code et de voir les résultats pour ce dont vous avez besoin.
Alex Zavatone
9

Vous pouvez utiliser le code suivant dans le cas où vous souhaitez vérifier les types de types de données primitifs.

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

Simple, [votre classe d'objet], elle renverra le nom de classe de votre objet.

AMohan
la source
1
En fait, il retournera un Classobjet. Cependant, le nom descriptionde cet objet sera le nom de la classe sous forme de chaîne, vous pouvez donc toujours le connecter à la console.
devios1