这是Swift中的标准样板弱容器。
struct Weak<T: AnyObject> {
weak var value: T?
init(value: T) {
self.value = value
}
}
除非您希望T
成为协议,否则效果很好,例如,
protocol ImplementationHiding: class {}
class Implementation: ImplementationHiding {}
let w = Weak(value: Implementation() as ImplementationHiding)
遗憾的是,这不能编译。我发现让它工作的唯一方法是在协议上引入@objc
:
@objc protocol ImplementationHiding {}
我找到的唯一方法是非常难看,因为它会抛弃编译时的安全性。
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()
}
}
如何使用原生Swift协议创建Weak
为T
?
答案 0 :(得分:1)
如果您对丢失一些编译时安全感很好,可以将Weak
更改为接受Any
T
,然后将值存储为AnyObject
:
struct Weak<T: Any>{
weak var value: AnyObject?
public var ref: T? {
get {
return value as? T
}
}
init(value: T) {
self.value = value as AnyObject
}
}