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!
3 answers
protocol AddsMoreCommands: class {
// Code
}
extension AddsMoreCommands where Self: UIViewController {
// Code
}
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
}
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
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