I have a generic struct declared as follows:
struct WeakReference<T: AnyObject> {
weak var value: T?
init(value: T?) {
self.value = value
}
}
And a protocol:
protocol SomeProtocol: class {
}
But I'm not able to declare a variable of type of WeakReference<SomeProtocol>
, the compiler complains that
'WeakReference' requires that
SomeProtocol
be a class type
Interestingly, in Swift, the class
is a typealias of AnyObject.
I actually want to hold an array of WeakReference<SomeProtocol>
because the array holds strong references.
Class-only generic constraints in Swift is a similar question but doesn't really solve this problem.
How can we pass the SomeProtocol
to WeakReference
?
EDIT: The following scenario compiles fine, but we lose the ability to hold weak reference:
struct Reference<T> {
var value: T?
init(value: T?) {
self.value = value
}
}
var array: [Reference<SomeProtocol>] = []
SomeProtocol
. It works if we don't have the constraint<T: AnyObject>
. But then we can't have weak references. – Cult