[swift-users] Weak references in generic types
Howard Lovatt
howard.lovatt at gmail.com
Mon Aug 29 01:21:19 CDT 2016
Hi,
I am wanting to use weak references in generic data structures; in the
example below Array, but in general any generic type. I can almost get it
to work :(
My experiments started off well; the following works:
// Array of weak references OK
struct WeakReference<T: AnyObject> {
weak var value: T?
}
class C {
var i: Int = 0
}
let c = C() // Strong reference to prevent collection
let weakCs = [WeakReference(value: c)] // OK
print("C: \(weakCs[0].value!.i)") // 0
I can add a protocol:
// Array of weak references that implements a protocol OK
protocol P: AnyObject { // Note AnyObject
var i: Int { get }
}
class CP: P {
var i: Int = 0
}
let cP = CP() // Strong reference to prevent collection
let weakCPs = [WeakReference(value: cP)] // OK
print("CP: \(weakCPs[0].value!.i)") // 0
But when I want an array of weak references to the protocol I get an error:
// Array of weak references of a protocol not OK
let weakPs: [WeakReference<P>] = [WeakReference(value: cP)] // Using 'P' as
a concrete type conforming to protocol 'AnyObject' is not supported
print("P: \(weakPs[0].value!.i)") // 0
Is there something I have missed?
The error message, "Using 'P' as a concrete type conforming to protocol
'AnyObject' is not supported", implies that it is a temporary limitation of
the compiler; is this going to be fixed? Should I lodge a bug report?
Thanks in advance for any advice,
-- Howard.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20160829/f70609c4/attachment.html>
More information about the swift-users
mailing list