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
?