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
}