web-dev-qa-db-fra.com

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"?

543
James Skidmore

Si votre objet est myObject et que vous souhaitez vérifier s'il s'agit d'un NSString, le code serait:

[myObject isKindOfClass:[NSString class]]

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

[myObject isKindOfClass:[UIImageView class]]
856
mmc

Vous utiliseriez probablement

- (BOOL)isKindOfClass:(Class)aClass

C'est une méthode de NSObject.

Pour plus d'informations, consultez la documentation NSObject.

Voici comment vous utilisez ceci.

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

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

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

Utiliser - (BOOL)isKindOfClass:(Class)aClass dans ce cas aurait pour résultat TRUE à la fois, car inheritedClass est aussi une sorte de superClass.

15
Yedy

En effectuant un test simple, je pensais 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 égale à l'autre classe.

Pour la ligne ci-dessous, nous avons des données mal formées qui peuvent être un NSArray, un 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 plutôt bien fonctionné que isMemberOfClass ne l’a pas fait.

11
Alex Zavatone

Vous pouvez utiliser le code suivant si 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)) 
7
Bajju

Simple, [yourobject class], il retournera le nom de la classe de yourobject.

5
AMohan