Quiero este protocolo:
protocol AddsMoreCommands {
/* ... */
}
solo para ser adoptado por clases que heredan de la clase UIViewController
. Esta página me dice que puedo especificar que solo es adoptado por una clase (a diferencia de una estructura) escribiendo
protocol AddsMoreCommands: class {
}
pero no veo cómo exigir que solo sea adoptado por una clase en particular. Esa página luego habla de agregar where
cláusulas a las extensiones de protocolo para verificar la conformidad, pero tampoco veo cómo adaptar eso.
extension AddsMoreCommands where /* what */ {
}
¿Hay alguna forma de hacer esto? ¡Gracias!
self
lugar deSelf
:-( ¡Muchas gracias, eso funciona bien!AddsMoreCommands
pero un método al que se la pasa espera unUIViewController
Esto también se puede lograr sin una extensión:
protocol AddsMoreCommands: class where Self: UIViewController { // code }
EDITADO 04/11/2017 : 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 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 omitirclass
y simplemente escribir lo siguiente y no habrá ninguna advertencia:protocol AddsMoreCommands where Self: UIViewController { // code }
fuente
AnyObject
lugar declass
.protocol AddsMoreCommands: AnyObject where Self: UIViewController { // code }
AnyObject
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
fuente
AddsMoreCommands
aUIViewController
la cual quería evitar ...typealias AddsMoreCommandsViewController = UIViewController & AddsMoreCommands
Ahora en Swift 5 puedes lograr esto:
protocol AddsMoreCommands: UIViewController { /* ... */ }
Muy útil.
fuente