我有一个通用结构声明如下:
struct WeakReference<T: AnyObject> {
weak var value: T?
init(value: T?) {
self.value = value
}
}
还有一个协议(protocol):
protocol SomeProtocol: class {
}
但我无法声明类型为 WeakReference<SomeProtocol>
的变量, 编译器提示说
'WeakReference' requires that
SomeProtocol
be a class type
有趣的是,在 Swift 中,class
是 AnyObject 的类型别名。
我实际上想保存一个 WeakReference<SomeProtocol>
的数组因为数组包含强引用。
Class-only generic constraints in Swift是一个类似的问题,但并没有真正解决这个问题。
我们怎样才能通过 SomeProtocol
至 WeakReference
?
编辑: 以下场景编译正常,但我们失去了持有弱引用的能力:
struct Reference<T> {
var value: T?
init(value: T?) {
self.value = value
}
}
var array: [Reference<SomeProtocol>] = []
最佳答案
很简单。您正在传递 SomeProtocol
,这是一个 protocol
。您需要向那里传递特定的类类型。
示例:
class SomeImplementation: SomeProtocol {
}
var weakSome: WeakReference<SomeImplementation> = ...
或者您可以通过使用 @objc
注释标记协议(protocol)来绕过它,但我不喜欢这种方法。
@objc protocol SomeProtocol: class {
}
var weakSome: WeakReference<SomeProtocol> = ...
尝试检查 this answer ,它可能会为您提供有关该问题的更多背景信息。
关于swift - AnyObject 类型泛型约束的引用类型协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51706773/