<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On 1 Sep 2016, at 03:23, Howard Lovatt via swift-users &lt;<a href="mailto:swift-users@swift.org" class="">swift-users@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Playing around I found that if you make the protocol @objc instead of AnyObject then it works :). EG:<div class=""><br class=""></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px" class=""><div class="">struct WeakReference&lt;T: AnyObject&gt; {</div><div class="">&nbsp; &nbsp; weak var value: T?</div><div class="">}</div><div class="">@objc protocol P { // Note @objc, class or AnyObject does not work</div><div class="">&nbsp; &nbsp; var i: Int { get }</div><div class="">}</div><div class="">class CP: P {</div><div class="">&nbsp; &nbsp; var i: Int = 0</div><div class="">}</div><div class="">let weakPs: [WeakReference&lt;P&gt;] = [WeakReference(value: cP)] // Note typed as `[WeakReference&lt;P&gt;]`</div><div class="">print("P: \(weakPs[0].value!.i)") // 0</div></blockquote><div class=""><p class=""><span class=""></span>Not a 'pure' Swift solution :(, but OK in my case.</p></div></div><div class="gmail_extra"><br clear="all" class=""><div class=""><div class="gmail_signature" data-smartmail="gmail_signature">&nbsp; -- Howard.<br class=""></div></div>
<br class=""><div class="gmail_quote">On 29 August 2016 at 16:21, Howard Lovatt <span dir="ltr" class="">&lt;<a href="mailto:howard.lovatt@gmail.com" target="_blank" class="">howard.lovatt@gmail.com</a>&gt;</span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="">Hi,<div class=""><br class=""></div><div class="">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 :(</div><div class=""><br class=""></div><div class="">My experiments started off well; the following works:</div><div class=""><br class=""></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class=""><div class="">// Array of weak references OK</div><div class="">struct WeakReference&lt;T: AnyObject&gt; {</div><div class="">&nbsp; &nbsp; weak var value: T?</div><div class="">}</div><div class="">class C {</div><div class="">&nbsp; &nbsp; var i: Int = 0</div><div class="">}</div><div class="">let c = C() // Strong reference to prevent collection</div><div class="">let weakCs = [WeakReference(value: c)] // OK</div><div class="">print("C: \(weakCs[0].value!.i)") // 0</div></blockquote><br class="">I can add a protocol:<div class=""><br class=""></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class=""><div class="">// Array of weak references that implements a protocol OK</div><div class="">protocol P: AnyObject { // Note AnyObject</div><div class="">&nbsp; &nbsp; var i: Int { get }</div><div class="">}</div><div class="">class CP: P {</div><div class="">&nbsp; &nbsp; var i: Int = 0</div><div class="">}</div><div class="">let cP = CP() // Strong reference to prevent collection</div><div class="">let weakCPs = [WeakReference(value: cP)] // OK</div><div class="">print("CP: \(weakCPs[0].value!.i)") // 0</div></blockquote><div class=""><div class=""><br class=""></div><div class="">But when I want an array of weak references to the protocol I get an error:</div><div class=""><br class=""></div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class=""><div class="">// Array of weak references of a protocol not OK</div><div class="">let weakPs: [WeakReference&lt;P&gt;] = [WeakReference(value: cP)] // Using 'P' as a concrete type conforming to protocol 'AnyObject' is not supported</div><div class="">print("P: \(weakPs[0].value!.i)") // 0</div></blockquote><div class=""><div class=""><br class=""></div><div class="">Is there something I have missed?</div><div class=""><br class=""></div><div class="">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?</div><div class=""><br class=""></div><div class="">Thanks in advance for any advice,</div><div class=""><br clear="all" class=""><div class=""><div data-smartmail="gmail_signature" class="">&nbsp; -- Howard.<br class=""></div></div>
</div></div></div>
</blockquote></div><br class=""></div>
_______________________________________________<br class="">swift-users mailing list<br class=""><a href="mailto:swift-users@swift.org" class="">swift-users@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-users<br class=""></div></blockquote></div><br class=""><div class="">Your problem is protocol self-conformance. In the first example, you’re creating WeakReference&lt;CP&gt;. CP conforms to P and to AnyObject. In the second example, you’re creating WeakReference&lt;P&gt;. P does not conform to P or to AnyObject.</div><div class=""><br class=""></div><div class="">As for why @objc fixes it? … ¯\_(ツ)_/¯ all bets are off whenever @objc gets involved in anything.</div><div class=""><br class=""></div><div class="">Karl</div></body></html>