En Objective-C, ¿cuál es el equivalente de la palabra clave "instanceof" de Java?

185

Me gustaría comprobar si un objeto (p someObject. Ej. ) Es asignable (apto para conversión) a una variable de otro tipo (p SpecifiedType. Ej .). En Java, puedo escribir:

someObject instanceof SpecifiedType

Una pregunta relacionada es encontrar si el tipo de tiempo de ejecución de un objeto es igual a otro tipo. En Java, puedo escribir:

someObject.getClass().equals(SpecifiedType.class)

¿Cómo se puede hacer esto en Objective-C?

Darthenius
fuente
Ver también: stackoverflow.com/q/8294076/165674
Dheeraj Vepakomma

Respuestas:

264

Intenta [myObject class]devolver la clase de un objeto.

Puede hacer comparaciones exactas con:

if ([myObject class] == [MyClass class])

pero no usando directamente el MyClassidentificador.

Del mismo modo, puede encontrar si el objeto es de una subclase de su clase con:

if ([myObject isKindOfClass:[AnObject class]])

según lo sugerido por Jon Skeet y zoul.

revs mouviciel
fuente
¿Cómo verificaría la igualdad con un objeto de tipo "AnObject", por ejemplo?
Dimitris
"if ([clase myObject] == ​​[clase AnObject])" o, según lo sugerido por Jon Skeet y zoul: "if ([myObject isKindOfClass: [clase AnObject]])"
mouviciel
8
la comparación exacta también se puede hacer conif ([myObject isMemberOfClass:[MyClass class]])
user102008
37

De Wikipedia :

En Objective-C, por ejemplo, tanto el genérico Objectcomo NSObject(en Cocoa / OpenStep) proporcionan el método isMemberOfClass:que devuelve truesi el argumento del método es una instancia de la clase especificada. El método de manera isKindOfClass:análoga devuelve verdadero si el argumento hereda de la clase especificada.

isKindOfClass:estaría más cerca de instanceof, por el sonido de la misma.

Jon Skeet
fuente
9

Consulte el método isKindOfClass: en la documentación de NSObject . (La palabra de advertencia habitual para tal pregunta es que verificar la clase de objeto es a menudo una señal de hacer algo mal).

zoul
fuente
2
Simplemente copiando de la "respuesta" a continuación: "@Zoul: ¿por qué se considera que la comprobación de tipo de clase es mala? ¿No es una buena programación defensiva o argumenta que debería ser innecesaria?"
Dan Rosenstark
1
Ajá, gracias. Un problema es que los objetos no tienen que ser de la clase que espera. Durante las pruebas, es bastante común pasar un código auxiliar de clase que respeta la interfaz, pero que tiene una clase diferente. O cuando observas cambios de valor usando KVO hay cierta magia hecha con las clases. Ambos casos son bastante legítimos y ambos se rompen fácilmente si su código hace verificaciones de clase explícitas. El comportamiento de cambio en clase es un diseño OO deficiente, estrechamente acoplado y difícil de extender. No digo que no exista un caso de uso legítimo para las verificaciones de clase, pero debe pensarlo dos veces antes de hacerlo.
zoul
@zoul En ese caso específico, esto sería simplemente inexperiencia, es más probable que se use + (BOOL)conformsToProtocol:(Protocol *)aProtocol.
EricLeaf