2009-02-11 26 views
182

Me gustaría comprobar si un objeto (por ejemplo, someObject) es asignable (cast-able) a una variable de otro tipo (por ejemplo, SpecifiedType). En Java, puedo escribir:En Objective-C, ¿cuál es el equivalente de la palabra clave "instanceof" de Java?

someObject instanceof SpecifiedType 

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

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

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

+0

Ver también: http://stackoverflow.com/q/8294076/165674 –

Respuesta

251

Pruebe [myObject class] para devolver la clase de un objeto.

Puede hacer comparaciones exactas con:

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

pero no utilizando directamente MyClass identificador.

Similarmente, se puede encontrar si el objeto es de una subclase de la clase con:

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

como se sugiere por Jon Skeet y Zoul.

+0

¿Cómo verificará? igualdad con un objeto de tipo "AnObject" por ejemplo? – Dimitris

+0

"if ([clase myObject] == ​​[clase AnObject])" o, como lo sugieren Jon Skeet y zoul: "if ([myObject isKindOfClass: [clase AnObject]])" – mouviciel

+7

la comparación exacta también se puede hacer con 'if ([myObject isMemberOfClass: [MyClass class]]) ' – user102008

37

De Wikipedia:

En Objective-C, por ejemplo, tanto la genérico Object y NSObject (en Cacao/OpenStep) proporcionar el método isMemberOfClass: que devuelve true si el argumento del método es una instancia de la clase especificada. El método isKindOfClass: análogamente devuelve verdadero si el argumento hereda de la clase especificada.

isKindOfClass: sería el más cercano a instanceof, por el sonido de él.

8

Consulte el método isKindOfClass: en la documentación NSObject. (La palabra de advertencia habitual para dicha pregunta es que la comprobación de la clase de objeto suele ser un signo de que se está haciendo algo mal.)

+2

Simplemente copiando de la" respuesta "a continuación:" @Zoul - ¿por qué se considera mala la verificación del tipo de clase? ¿No es una buena programación defensiva o estás argumentando que debería ser innecesaria? " –

+1

Aha, gracias. Un problema es que los objetos no tienen que ser de la clase que estás esperando. Durante las pruebas, es bastante común aprobar un código de clase que respeta la interfaz, pero tiene una clase diferente. O cuando observa cambios de valores usando KVO, se realiza cierta magia con las clases. Ambos casos son bastante legítimos y ambos se rompen fácilmente si su código hace controles de clase explícitos. El comportamiento de conmutación en clase es un diseño OO deficiente, estrechamente acoplado y difícil de extender. No estoy diciendo que no haya un caso de uso legítimo para los controles de clase, pero debes pensarlo dos veces antes de hacerlo. – zoul

+0

@zoul En ese caso específico, esto sería simplemente inexperiencia, uno más probablemente usaría '+ (BOOL) conformsToProtocol: (Protocol *) aProtocol'. – EricLeaf

Cuestiones relacionadas