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"?
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"?
Réponses:
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 myObject
pour UIImageView
:
[myObject isKindOfClass:[UIImageView class]]
Vous utiliseriez probablement
- (BOOL)isKindOfClass:(Class)aClass
Ceci est une méthode de NSObject
.
Pour plus d'informations, consultez la 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");
}
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 NSLog
s 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.
NSLog(@"Is of type: %@", [element class]);
fonctionnera dans iOS 7
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)aClass
dans ce cas se traduirait par TRUE les deux fois car la inheritedClass est également une sorte de superClass.
isMemberOfClass:
reviendra NO
lors du traitement des sous-classes.
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 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é, mais isMemberOfClass
pas.
[object isKindOfClass:[ClassName class]]