> On 1 Sep 2016, at 03:23, Howard Lovatt via swift-users 
> <swift-users@swift.org> wrote:
> 
> 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 
> <mailto: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

Your problem is protocol self-conformance. In the first example, you’re 
creating WeakReference<CP>. CP conforms to P and to AnyObject. In the second 
example, you’re creating WeakReference<P>. P does not conform to P or to 
AnyObject.

As for why @objc fixes it? … ¯\_(ツ)_/¯ all bets are off whenever @objc gets 
involved in anything.

Karl
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to