protocolos programacion orientada objetos multiple herencia swift generics protocols

swift - programacion - Cómo exigir que un protocolo solo pueda ser adoptado por una clase específica



protocolos swift 4 (3)

Quiero este protocolo:

protocol AddsMoreCommands { /* ... */ }

solo para ser adoptado por las clases que heredan de la clase UIViewController . Esta página me dice que puedo especificar que solo es adoptada por una clase (a diferencia de una estructura) escribiendo

protocol AddsMoreCommands: class { }

pero no puedo ver cómo exigir que solo sea adoptado por una clase en particular. Esa página luego habla sobre agregar cláusulas where a las extensiones de protocolo para verificar la conformidad, pero tampoco puedo ver cómo adaptar eso.

extension AddsMoreCommands where /* what */ { }

¿Hay alguna forma de hacer esto? ¡Gracias!


Debido a un problema en la respuesta anterior, terminé con esta declaración:

protocol AddsMoreCommands where Self : UIViewController { // protocol stuff here }

sin advertencias en Xcode 9.1


Esto también se puede lograr sin una extensión:

protocol AddsMoreCommands: class where Self: UIViewController { // code }

EDITADO 2017/11/04 : Como señaló Zig , esto parece generar una advertencia en Xcode 9.1. Actualmente hay un problema reportado en el proyecto Swift (SR-6265) para eliminar la advertencia, lo vigilaré y actualizaré la respuesta en consecuencia.

EDITADO 29/09/2018 : la class es necesaria si la variable que almacenará la instancia debe ser débil (como un delegado). Si no necesita una variable débil, puede omitir la class y simplemente escribir lo siguiente y no habrá ninguna advertencia:

protocol AddsMoreCommands where Self: UIViewController { // code }


protocol AddsMoreCommands: class { // Code } extension AddsMoreCommands where Self: UIViewController { // Code }