objective-c class syntax protocols

objective c - ¿Puede un objeto de clase ObjC ajustarse a un protocolo?



objective-c class (2)

¿Hay alguna manera de indicar al compilador que un objeto de clase se ajusta a un protocolo?

Según tengo entendido, al crear métodos de clase +(void)foo , una instancia de ese objeto de clase tendrá esos métodos como métodos de instancia . Por lo tanto, siempre que crea métodos +(void)foo para todos los métodos de protocolo requeridos, puedo hacer que un objeto de clase actúe como delegado.

Mi problema, por supuesto, es que en el archivo de encabezado de la clase, solo sé cómo indicar que las instancias de la clase se ajustan al protocolo (como suele ser el caso). Entonces, lo mejor que he descubierto es lanzar el objeto de clase así:

something.delegate = (id<SomethingDelegate>)[self class]

¿Algunas ideas?

Relacionado, pero diferente: ObjC: ¿hay algo así como un "protocolo de clase"?


Lo que estás haciendo ahora es correcto, ya que silenciará las advertencias, que es tu objetivo. Estará enviando los mensajes de objeto de clase definidos en el protocolo para instancias que son un poco confusas, pero al tiempo de ejecución no le importa.

Piénselo de esta manera: desea establecer un delegado en un objeto que responda a los mensajes definidos en el protocolo. Tu clase hace esto, y tu clase también es un objeto. Por lo tanto, debe tratar a su clase como un objeto que se ajuste a ese protocolo. Por lo tanto, lo que has escrito es completamente correcto (en función de lo que intentas hacer).

Una cosa a tener en cuenta, sin embargo, es que esta clase no responderá adecuadamente a conformsToProtocol: En general, esto está bien para la configuración de un delegado (los delegados generalmente no verifican si la clase se ajusta, simplemente verifican si puede responder a un selector).

Como nota al margen, una cosa que puedes hacer sintácticamente es:

Class<SomethingDelegate> variable = (Class<SomethingDelegate>)[self class];

La diferencia aquí es que el compilador utilizará los métodos de clase del protocolo en lugar de los mensajes de instancia. Sin embargo, esto no es lo que quieres en tu caso.


No hay sintaxis de Objective-C para indicar que una metaclase se ajusta a un protocolo.

Creo que puedes hacerlo en tiempo de ejecución, usando class_addProtocol en la metaclase. Pero no lo he intentado.

Supongo que también podría escribir un método +conformsToProtocol: en su clase y mentir sobre su conformidad. Esto podría tener efectos secundarios inesperados, ya que ya hay un +conformsToProtocol: NSObject +conformsToProtocol: en NSObject (además de -conformsToProtocol: .

Ninguno de estos eliminará la necesidad de un molde para cerrar el compilador. Solo usa un singleton.