Comment tester si un object est une instance d’une classe particulière dans Objective-C? Disons que je veux voir si l’object a est une instance de la classe b, ou de la classe c, comment puis-je le faire?
Pour tester si object est une instance de classe a:
[yourObject isKindOfClass:[a class]] // Returns a Boolean value that indicates whether the receiver is an instance of // given class or an instance of any class that inherits from that class.
ou
[yourObject isMemberOfClass:[a class]] // Returns a Boolean value that indicates whether the receiver is an instance of a // given class.
Pour obtenir le nom de la classe de l’object, vous pouvez utiliser la fonction NSSsortingngFromClass
:
NSSsortingng *className = NSSsortingngFromClass([yourObject class]);
ou c-function à partir d’API runtime objective-c:
#import /* ... */ const char* className = class_getName([yourObject class]); NSLog(@"yourObject is a: %s", className);
EDIT: In Swift
if touch.view is UIPickerView { // touch.view is of type UIPickerView }
Vous pouvez aussi utiliser
NSSsortingng *className = [[myObject class] description];
sur n’importe quel object NSObject
Que signifie sur isKindOfClass dans la documentation Apple?
Soyez prudent lorsque vous utilisez cette méthode sur des objects représentés par un cluster de classes. En raison de la nature des groupes de classes, l’object que vous récupérez peut ne pas toujours être le type attendu. Si vous appelez une méthode qui renvoie un cluster de classes, le type exact renvoyé par la méthode est le meilleur indicateur de ce que vous pouvez faire avec cet object. Par exemple, si une méthode renvoie un pointeur sur un object NSArray, vous ne devez pas utiliser cette méthode pour voir si le tableau est modifiable, comme indiqué dans le code suivant:
// DO NOT DO THIS! if ([myArray isKindOfClass:[NSMutableArray class]]) { // Modify the object }
Si vous utilisez de telles constructions dans votre code, vous pouvez penser qu’il est possible de modifier un object qui, en réalité, ne devrait pas être modifié. Cela pourrait alors créer des problèmes pour un autre code qui s’attend à ce que l’object rest inchangé.
Si vous voulez vérifier une classe spécifique, vous pouvez utiliser
if([MyClass class] == [myClassObj class]) { //your object is instance of MyClass }
Si vous voulez obtenir le nom de la classe, appelez simplement: –
id yourObject= [AnotherClass returningObject]; NSSsortingng *className=[yourObject className]; NSLog(@"Class name is : %@",className);
Vous pouvez également vérifier le temps d’exécution. Mettez un point d’arrêt dans le code et à l’intérieur de la console (lldb) écrivez
(lldb) po [yourObject class]
Comme ça..