在Swift中创建一个接受本机Swift协议的弱容器

时间:2017-11-22 17:53:40

标签: swift

这是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协议创建WeakT

1 个答案:

答案 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
    }
}