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


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


515
2017-07-17 17:19


origine


Réponses:


Si votre objet est myObject, et vous voulez tester pour voir si c'est un NSString, le code serait:

[myObject isKindOfClass:[NSString class]]

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

[myObject isKindOfClass:[UIImageView class]]

826
2017-07-17 17:28



Vous utiliseriez probablement

- (BOOL)isKindOfClass:(Class)aClass

Ceci est une méthode de NSObject.

Pour plus d'informations, consultez le NSObject Documentation.

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

53
2017-07-17 17:33



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

En utilisant - (BOOL)isKindOfClass:(Class)aClass dans ce cas, TRUE serait deux fois, car la classe inheritedClass est aussi une sorte de superclasse.


12
2017-08-13 11:38



Exécuter un test simple, je pensais documenter ce qui fonctionne et ce qui ne fonctionne pas. Souvent, je vois des gens vérifier pour voir si la classe de l'objet est un 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 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é isMemberOfClass n'a pas fait.


11
2017-10-08 21:46



Vous pouvez utiliser le code suivant dans le cas où vous voulez 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)) 

6
2018-05-08 08:27



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


4
2018-05-14 13:44