577 votes

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

J'ai besoin de tester si l'objet est de type NSString ou UIImageView . Comment puis-je accomplir cela? Existe-t-il un type de méthode "isoftype"?

912voto

mmc Points 12051

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

 [myObject isKindOfClass:[NSString class]]
 

De même, si vous voulez tester myObject pour un UIImageView :

 [myObject isKindOfClass:[UIImageView class]]
 

54voto

Bryan Hare Points 551

Vous utiliseriez probablement

 - (BOOL)isKindOfClass:(Class)aClass
 

C'est une fonction du NSObject .

Pour plus d'informations, consultez la documentation NSObject .

C'est comme ça que 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");    
}
 

16voto

Yedy Points 1165

Lorsque vous voulez différer entre une superclasse et la classe inherited, 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 de - (BOOL)isKindOfClass:(Class)aClass dans ce cas donnerait TRUE à la fois parce que la classe inheritedClass est aussi une sorte de superclasse.

14voto

Alex Zavatone Points 901

L'exécution d'un test simple, je pensais le document ce qui fonctionne et ce qui ne fonctionne pas. Souvent je vois des gens de la vérification pour voir si la classe de l'objet est un membre de l'autre classe ou est égal à l'autre classe.

Pour la ligne ci-dessous, nous avons quelques peu formée de données qui peut être un NSArray, NSDictionary ou (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]);
}

isKindOfClass a fonctionné plutôt bien - isMemberOfClass n'ont pas.

11voto

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

strcmp ([myNumber objCType], @encode (double)) // Renvoie 0 si le type d'objet est égal à double

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X