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 whereclá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!

selflugar deSelf:-( ¡Muchas gracias, eso funciona bien!AddsMoreCommandspero un método al que se la pasa espera unUIViewControllerEsto 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 :
classes necesario si la variable que almacenará la instancia necesita ser débil (como un delegado). Si no necesita una variable débil, puede omitirclassy simplemente escribir lo siguiente y no habrá ninguna advertencia:protocol AddsMoreCommands where Self: UIViewController { // code }fuente
AnyObjectlugar declass.protocol AddsMoreCommands: AnyObject where Self: UIViewController { // code }AnyObjectDebido 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
AddsMoreCommandsaUIViewControllerla cual quería evitar ...typealias AddsMoreCommandsViewController = UIViewController & AddsMoreCommandsAhora en Swift 5 puedes lograr esto:
protocol AddsMoreCommands: UIViewController { /* ... */ }Muy útil.
fuente