objective-c cocoa protocols category

objective c - ¿Puede una categoría implementar simultáneamente un protocolo?



objective-c cocoa (3)

Si una categoría que estoy creando para una clase agrega métodos que también cumplen con el contrato establecido por un protocolo, me gustaría marcar esa clase de categoría como implementadora del protocolo, y por lo tanto indicar al preprocesador Obj-C que el La clase implementa efectivamente el protocolo también.

Ejemplo de delegado (por claridad, gracias Ole!):

@protocol SomeDelegate <NSObject> - (void)someDelegateMessage; @end

Categoría de ejemplo:

@interface NSObject (SomeCategory) <SomeDelegate> - (void)someDelegateMessage; @end

Y con una puesta en práctica típica.

@implement NSObject (SomeCategory) - (void)someDelegateMessage {} @end

Cuando realmente intento esto, recibo una advertencia para cada método NSObject:

advertencia: implementación incompleta de la categoría ''SomeCategory''

advertencia: definición de método para ''-descripción'' no encontrada

...

advertencia: definición de método para ''-isEqual:'' no encontrada

advertencia: la categoría ''SomeCategory'' no implementa completamente el protocolo ''NSObject''

Funciona bien si <SomeDelegate> de la declaración, pero, por supuesto, NSObject no se reconoce como SomeDelegate


¿Alguna posibilidad de que su declaración de protocolo incluya el protocolo NSObject ? Me gusta esto:

@protocol SomeDelegate <NSObject> ...

De ahí es de donde vienen las advertencias porque ahora su categoría no implementa el protocolo completo. En el código de prueba que acabo de escribir, al eliminar NSObject del protocolo se eliminan las advertencias del compilador.


Si desea que el compilador se calle sobre el envío de mensajes <NSObject> (y es importante que recuerde que ese es el nombre del protocolo, no el nombre de la clase), entonces solo use las variables ''id'', no ''id'', ya que así lo dice explícitamente compilador "Este es un objeto que solo implementa el protocolo SomeDelegate".

Alternativamente, use NSObject como su tipo de variable en su lugar.


Una solución es declarar el protocolo en una categoría sin implementación, e implementar el método en una categoría diferente, por ejemplo:

@interface NSObject (SomeCategory) <SomeDelegate> - (void)someDelegateMessage; @end @implementation NSObject (SomeCategory_Impl) - (void)someDelegateMessage {} @end

Si lo hace, se considerará que NSObject se ajusta a <SomeDelegate> en el momento de la compilación, y las verificaciones en tiempo de ejecución de someDelegateMessage se realizarán correctamente. Sin embargo, las comprobaciones conformsToProtocol: runtime fallarán.

Por supuesto, debe presentar un error solicitando que los métodos declarados en la clase principal no generen advertencias.