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
?