I'm trying to create a generic WeakReference type that I can put into an array (and ultimately create a generic weak array type).
So far so good, but the following code:
class WeakReference<ElementType: AnyObject> {
    weak var element: ElementType?
    init(_ element: ElementType) {
        self.element = element
    }
}
protocol Element: AnyObject {}
class WeakElementHolder {
    var weakElements: [WeakReference<Element>] = []
}
Produces this compiler error:
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> {
  ^
This is strange because the Protocol definitely requires a class (AnyObject).
Strangely everything works fine if I leave out the generics:
protocol Element: AnyObject {}
class WeakElementReference {
    weak var element: Element?
    init(_ element: Element) {
        self.element = element
    }
}
class WeakElementHolder {
    var weakElements: [WeakElementReference] = []
}
Searching around I found this question but it wasn't really answered.
Is there a workaround to still somehow implement a generic array of weak references that works with class bound protocols?
UPDATE:
My concrete use case is to store a list of observers that get notified when something happens:
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
    }
}
These observers can be many different concrete types.
More Clarification:
There is not only one Observer protocol, there are many that have nothing in common, this is why I want this to be generic in the first place.
 
    