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

在Swift中创建接受本机Swift协议的弱容器,swift,Swift,这是Swift中的标准样板弱容器 struct Weak<T: AnyObject> { weak var value: T? init(value: T) { self.value = value } } 遗憾的是,这并没有被编译。我发现让它工作的唯一方法是在协议上引入@objc: @objc protocol ImplementationHiding {} 我发现的唯一解决这个问题的方法是非常丑陋的,因为它抛出了编译时安全性 struct Weak&l

这是Swift中的标准样板弱容器

struct Weak<T: AnyObject> {
  weak var value: T?
  init(value: T) {
    self.value = value
  }  
}
遗憾的是,这并没有被编译。我发现让它工作的唯一方法是在协议上引入
@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()
  }
}
struct弱{
私人出租:()->T?
init(值:AnyObject,类型:T.type=T.self){
get={[弱值]作为!T?}
}
var值:T{
return get()
}
}

如何使用本机Swift协议作为
T
创建
Weak

如果您不介意丢失一些编译时安全性,您可以将
Weak
更改为接受
任何
作为
T
,然后将值存储为
任何对象

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
    }
}
struct弱{
弱var值:任何对象?
公共变量:T{
得到{
返回值为?T
}
}
初始值(值:T){
self.value=作为任何对象的值
}
}

我刚才做的一些挖掘表明,这可能是不可能的,因为。您可以通过传递一个闭包来返回类型安全性:
init({value:U,upcast:@escaping(U)->T){self.get={value.map中的[weak value]值{upcast($0)}
(然后调用just pass
{0}
实现
向上转换为
实现隐藏
)。虽然令人烦恼的是,这需要在构建包装时知道具体类型,并且不允许外部世界设置
value
。但是,是的,这里的主要问题是。是的,这似乎是SR-55的本质。您不需要
t:Any
。简单的
T
将起作用。除此之外,这工作得很好,与我的解决方案非常相似,尽管我更喜欢你的解决方案。严格地说,这并不能回答问题,但我认为这是我们将要得到的最接近的答案。是的,我留下它是为了教育目的。。。也许我应该提一下,我知道这并不能完全回答问题,我已经为同一个问题苦恼了很长时间。我真的很想看到你问题的正确答案:)
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
    }
}