【发布时间】:2019-01-19 07:45:23
【问题描述】:
我正在尝试创建一个可以放入数组的通用 WeakReference 类型(并最终创建一个通用的弱数组类型)。
到目前为止一切顺利,但代码如下:
class WeakReference<ElementType: AnyObject> {
weak var element: ElementType?
init(_ element: ElementType) {
self.element = element
}
}
protocol Element: AnyObject {}
class WeakElementHolder {
var weakElements: [WeakReference<Element>] = []
}
产生此编译器错误:
WeakReference.swift:12:21: error: 'WeakReference' requires that 'Element' be a class type
var weakElements: [WeakReference<Element>] = []
^
WeakReference.swift:1:7: note: requirement specified as 'ElementType' : 'AnyObject' [with ElementType = Element]
class WeakReference<ElementType: AnyObject> {
^
这很奇怪,因为协议肯定需要一个类 (AnyObject)。
奇怪的是,如果我省略了泛型,一切都会正常工作:
protocol Element: AnyObject {}
class WeakElementReference {
weak var element: Element?
init(_ element: Element) {
self.element = element
}
}
class WeakElementHolder {
var weakElements: [WeakElementReference] = []
}
四处搜索我找到了this question,但没有得到真正的回答。
是否有一种解决方法仍然可以以某种方式实现与类绑定协议一起使用的通用弱引用数组?
更新:
我的具体用例是存储一个观察者列表,当事情发生时会得到通知:
protocol Observer: AnyObject {
func notify()
}
class WeakReference<ElementType: AnyObject> {
weak var element: ElementType?
init(_ element: ElementType) {
self.element = element
}
}
class WeakArray<ElementType: AnyObject> {
var content: [WeakReference<ElementType>] = []
}
class Observable {
var observers: WeakArray<Observer>()
func notifyAllObservers() {
// call notify() on all observers here
}
}
这些观察者可以是许多不同的具体类型。
更多说明:
不仅有一个Observer 协议,还有很多没有共同点,这就是为什么我首先希望它是通用的。
【问题讨论】:
标签: arrays swift generics weak-references swift-protocols