Tengo un protocolo que he creado (en Swift 4.2) y uno de sus requisitos es una propiedad que es del mismo tipo que el propio protocolo.
Como ejemplo, tengo un protocolo definido así:
protocol A { var a: A? { get set } }Tengo varios Modelos que se ajustan a este protocolo:
class Model1: A { var a: A? } class Model2: A { var a: A? } Para uno de mis modelos, necesito satisfacer el requisito del protocolo siendo más específico para la propiedad definida por la variable a (es decir, la variable con el tipo de protocolo). Entonces, por ejemplo, es posible que desee implementar Model2 como:
class Model2: A { var a: Model1? } En este caso, dado que Model1 se ajusta al protocolo A , esperaría que esto pudiera satisfacer el requisito del protocolo; sin embargo, aparece un error en su lugar:
El tipo 'Model2' no se ajusta al protocolo 'A'
¿Por qué sucede esto y qué puedo hacer para que funcione como se describe anteriormente?
Apéndice
Modelé el escenario anterior en un Xcode Playground y aquí hay una captura de pantalla del error que veo. 
Para cumplir con el protocolo A, Model2 necesitaría un miembro var a que permita almacenar una referencia a cualquier cosa que se ajuste al protocolo A, no solo una referencia a Model1 . Así que no puedes hacer esto.
Podrías hacer esto con tipos asociados:
protocol A { associatedtype B: A var a: B? { get } }Esto le permitiría declarar Model2 con la especificidad que desee:
class Model2: A { var a: Model1? } Pero desafortunadamente, eso significaría que ya no podría declarar variables de tipo A Para arreglar eso, podrías usar modelos genéricos:
class Model1<T: A>: A { var a: T? }