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.
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users