Cree un contenedor débil en Swift que acepte un protocolo nativo de Swift

Aquí está el contenedor débil estándar repetitivo en Swift.

struct Weak<T: AnyObject> {
  weak var value: T?
  init(value: T) {
    self.value = value
  }  
}

Funciona bien a menos que quierasT ser un protocolo, por ejemplo,

protocol ImplementationHiding: class {}
class Implementation: ImplementationHiding {}
let w = Weak(value: Implementation() as ImplementationHiding)

Esto no se compila, lamentablemente. La única forma en que he encontrado para que funcione es presentar@objc en el protocolo:

@objc protocol ImplementationHiding {}

La única forma en que he encontrado esto es bastante fea, ya que arroja seguridad en tiempo de compilación.

struct Weak<T> {
  private let get: () -> T?
  init(value: AnyObject, type: T.Type = T.self) {
    get = { [weak value] in value as! T? }
  }
  var value: T? {
    return get()
  }
}

Como puedo crearWeak con un protocolo nativo de Swift comoT?

Respuestas a la pregunta(1)

Su respuesta a la pregunta