Playing around I found that if you make the protocol @objc instead of AnyObject then it works :). EG:
struct WeakReference<T: AnyObject> { weak var value: T? } @objc protocol P { // Note @objc, class or AnyObject does not work var i: Int { get } } class CP: P { var i: Int = 0 } let weakPs: [WeakReference<P>] = [WeakReference(value: cP)] // Note typed as `[WeakReference<P>]` print("P: \(weakPs[0].value!.i)") // 0 Not a 'pure' Swift solution :(, but OK in my case. -- Howard. On 29 August 2016 at 16:21, Howard Lovatt <howard.lov...@gmail.com> wrote: > 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