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


Quiero este protocolo:

protocol AddsMoreCommands {
     /* ... */
}

Solo para ser adoptado por clases que hereden de la clase UIViewController. Esta página me dice que puedo especificar que solo es adoptada por una clase (en lugar 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 posterior habla de agregar where cláusulas a las extensiones de protocolo para verificar la conformidad, pero tampoco puedo ver cómo adaptarlas.

extension AddsMoreCommands where /* what */ {
}

¿Existe ¿una forma de hacer esto? ¡Gracias!

Author: Moritz, 2016-02-01

3 answers

protocol AddsMoreCommands: class {
    // Code
}

extension AddsMoreCommands where Self: UIViewController {
    // Code
}
 58
Author: Roee84,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 05:00:59

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

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

EDITADO 2017/11/04: Como Zig señaló, 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.

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

protocol AddsMoreCommands where Self: UIViewController {
   // code
}
 31
Author: rgkobashi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-29 11:59:28

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

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

No hay advertencias en Xcode 9.1

 29
Author: Massmaker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-12 19:11:48