Requisito de propiedad débil en el protocolo Swift con el tipo asociado

Quiero escribir un protocolo con un requisito de propiedad débil. La class que lo conforma debe poder especificar cualquier tipo para esta propiedad. Además, no quiero especificar un tipo real, por lo que debería ser un tipo especificado con algún protocolo. Este código muestra mi idea de propiedad no débil:

protocol ObjectProtocol: class { typealias PropertyType var property: PropertyType {get set} } protocol FirstPropertyProtocol: class {} protocol SecondPropertyProtocol: class {} class FirstObjectImpl: ObjectProtocol { var property: FirstPropertyProtocol? } class SecondObjectImpl: ObjectProtocol { var property: SecondPropertyProtocol? } 

Funciona como se esperaba.

Traté de hacer lo mismo por properties débiles:

 protocol ObjectProtocol: class { typealias WeakPropertyType: AnyObject //must be a class type weak var weakProperty: WeakPropertyType? {get set} } protocol WeakPropertyProtocol: class {} class ObjectImpl: ObjectProtocol { weak var weakProperty: WeakPropertyProtocol? } 

Y tengo un error de comstackdor:

Tipo 'ObjectImpl' no cumple con el protocolo 'ObjectProtocol'

¿Hay alguna forma de que pueda hacer que esto funcione?

No creo que un protocolo pueda imponer la debilidad. Por ejemplo:

 protocol ObjectProtocol: class { weak var weakProperty: AnyObject? {get set} } class ObjectImpl1: ObjectProtocol { weak var weakProperty: AnyObject? } class ObjectImpl2: ObjectProtocol { var weakProperty: AnyObject? } 

Ambos comstackn bien, aunque el protocolo es weak pero ObjectImpl2 no lo implementa.

EDIT: ¿Es esto lo que buscas? …

 protocol ObjectProtocol: class { typealias WeakPropertyType: Any //must be a class type var weakProperty: WeakPropertyType? {get set} } protocol WeakPropertyProtocol: class {} class ObjectImpl: ObjectProtocol { typealias WeakPropertyType = WeakPropertyProtocol weak var weakProperty: WeakPropertyProtocol? } 

Esta implementación requiere el uso de Any en lugar de AnyObject, ya que WeakPropertyProtocol es un protocolo en lugar de una class.

¿O esto?…

 protocol WeakPropertyProtocol: class {} protocol ObjectProtocol: class { typealias WeakPropertyType: AnyObject //must be a class type var weakProperty: WeakPropertyType? {get set} } class MyWeakClass: WeakPropertyProtocol { } class ObjectImpl: ObjectProtocol { typealias WeakPropertyType = MyWeakClass weak var weakProperty: MyWeakClass? } 

De cualquier manera, creo que la key está en definir qué class / protocolo usar para WeakPropertyType .

Hice que funcione con el atributo @objc para WeakPropertyProtocol:

 protocol ObjectProtocol: class { typealias WeakPropertyType: AnyObject //must be a class type weak var weakProperty: WeakPropertyType? {get set} } @objc protocol WeakPropertyProtocol {} class SomeObjectImpl: ObjectProtocol { weak var weakProperty: WeakPropertyProtocol? } 

No es una mejor solución porque me preocupa esta nota de apple doc

Tenga en count también que los protocolos @objc pueden ser adoptados solo por classs que henetworkingan de classs Objective-C u otras classs @objc.

Puedo vivir con esta restricción, pero apreciaré cualquier solución mejor.