Crie um contêiner fraco no Swift que aceite um protocolo Swift nativo

Aqui está o recipiente fraco padrão do Swift.

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

Funciona bem, a menos que você queiraT para ser um protocolo, por exemplo,

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

Infelizmente, isso não compila. A única maneira que encontrei para fazê-lo funcionar é introduzir@objc no protocolo:

@objc protocol ImplementationHiding {}

A única maneira que encontrei em relação a isso é bastante feia, pois gera segurança em tempo de compilação.

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 posso criarWeak com um protocolo Swift nativo comoT?

questionAnswers(1)

yourAnswerToTheQuestion