¿Cómo pruebo qué clase es un objeto en Objective-C?

Resuelto futureelite7 asked hace 14 años • 6 respuestas

¿Cómo pruebo si un objeto es una instancia de una clase particular en Objective-C? Digamos que quiero ver si el objeto a es una instancia de la clase b o de la clase c, ¿cómo hago para hacerlo?

futureelite7 avatar Jan 13 '10 17:01 futureelite7
Aceptado

Para probar si el objeto es una instancia de la clase 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.

o

[yourObject isMemberOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of a 
// given class.

Para obtener el nombre de clase del objeto, puede usar NSStringFromClassla función:

NSString *className = NSStringFromClass([yourObject class]);

o función c de la API de tiempo de ejecución de Objective-C:

#import <objc/runtime.h>

/* ... */

const char* className = class_getName([yourObject class]);
NSLog(@"yourObject is a: %s", className);

EDITAR: En Swift

if touch.view is UIPickerView {
    // touch.view is of type UIPickerView
}
Vladimir avatar Jan 13 '2010 10:01 Vladimir

También puedes usar

NSString *className = [[myObject class] description]; 

en cualquier NSObject

Clement M avatar Jan 07 '2013 14:01 Clement M

¿Qué significa isKindOfClass en la documentación de Apple ?

Tenga cuidado al utilizar este método en objetos representados por un grupo de clases. Debido a la naturaleza de los grupos de clases, es posible que el objeto que obtenga no siempre sea del tipo que esperaba. Si llama a un método que devuelve un grupo de clases, el tipo exacto devuelto por el método es el mejor indicador de lo que puede hacer con ese objeto. Por ejemplo, si un método devuelve un puntero a un objeto NSArray, no debes usar este método para ver si la matriz es mutable, como se muestra en el siguiente código:

// DO NOT DO THIS!
if ([myArray isKindOfClass:[NSMutableArray class]])
{
    // Modify the object
}

Si utiliza tales construcciones en su código, podría pensar que está bien modificar un objeto que en realidad no debería modificarse. Hacerlo podría crear problemas para otro código que esperaba que el objeto permaneciera sin cambios.

Duke avatar Jan 23 '2014 02:01 Duke