<div dir="ltr">Using a protocol with an &quot;as?&quot; cast convinces the compiler to do a dynamic lookup for a protocol conformance based on the value&#39;s actual type:<div><br><div><div>    protocol MyEncodable {</div><div>        func encoded() -&gt; Any</div><div>    }</div><div><br></div><div>    func encode&lt;T&gt;(_ value: T) -&gt; Any {</div><div>        if let value = value as? MyEncodable {</div><div>            // print(&quot;Calling complex encoding for value&quot;)</div><div>            return value.encoded()</div><div>        } else {</div><div>            // print(&quot;Calling simple encoding for value&quot;)</div><div>            return value</div><div>        }</div><div>    }</div><div><br></div><div>    extension Set: MyEncodable {</div><div>        func encoded() -&gt; Any {</div><div>            // print(&quot;Calling complex encoding for Set&quot;)</div><div>            return self.map { $0 }</div><div>        }</div><div>    }</div><div><br></div><div><br></div><div>    print(type(of: encode(3)))                      // Int</div><div>    print(type(of: encode(Set([3,4,5]))))          // Array&lt;Int&gt;</div><div><br></div><div>    func genericEncode&lt;T&gt;(_ value:T) -&gt; Any {</div><div>        return encode(value)</div><div>    }</div><div><br></div><div>    print(type(of: genericEncode(3)))               // Int</div><div>    print(type(of: genericEncode( Set([3,4,5]))))   // <b>Array&lt;Int&gt;</b></div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature"><div dir="ltr"><div><br></div><div>(You could&#39;ve just used a protocol for everything, and done away with encode() as a free function, except that you can&#39;t make .encoded() work on any arbitrary type without an explicit conformance, and &quot;extension Any: MyEncodable&quot; isn&#39;t allowed.)</div><div><br></div><div>-Jacob<br></div></div></div></div>
<br><div class="gmail_quote">On Mon, Jul 3, 2017 at 10:44 PM, David Baraff via swift-users <span dir="ltr">&lt;<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I’m trying to provide some custom serialization from within a generic class.<br>
(Briefly put, I want to automatically convert types like Set to an array upon serialization, and the reverse when I read it back.)<br>
<br>
While trying things out, I was suprised by this:<br>
<br>
public func encode&lt;T&gt;(_ value:T) -&gt; Any {<br>
    // print(&quot;Calling simple encoding for value&quot;)<br>
    return value<br>
}<br>
<br>
public func encode&lt;T&gt;(_ value:Set&lt;T&gt;) -&gt; Any {<br>
    // print(&quot;Calling complex encoding for value&quot;)<br>
    return value.map { $0 }<br>
}<br>
<br>
——————————————<br>
<br>
The above transforms a Set to a list, but leaves everything else alone.  As expected:<br>
<br>
<br>
print(type(of: encode(3)))                      // Int<br>
print(type(of: encode( Set([3,4,5]))))          // Array&lt;Int&gt;<br>
<br>
Good.  But now I do this:<br>
<br>
func genericEncode&lt;T&gt;(_ value:T) -&gt; Any {<br>
    return encode(value)<br>
}<br>
<br>
print(type(of: genericEncode(3)))               // Int<br>
print(type(of: genericEncode( Set([3,4,5]))))   // Set&lt;Int&gt;<br>
<br>
Aha.  Inside my generic function, I’ve “lost” the ability to overload based on type.  In retrospect, this is perhaps not to surprising.  Still, is there anyway that I can provide specialized versions of my functions which will take effect when called from *within* a generic function?<br>
<br>
I’m basically trying to leave any type that is happy to go to/from UserDefaults alone, but for some set of types which isn’t JSON serializable (e.g. Set) I’d like to provide a simple pathway.  I don’t aim to hit every type in the world, but right now, I’m *totally* stymied when trying to do the serialization from within a generic class, as I lost any ability to specialize which function gets called.<br>
<br>
[I’m from the C++ world of templates and metaprogramming, and I’m shifting from one set of constraints to another.  The swift type system with generics is cool and powerful, but man i’m still trying to really wrap my head around it.  Not that C++ was any easier…]<br>
<br>
<br>
______________________________<wbr>_________________<br>
swift-users mailing list<br>
<a href="mailto:swift-users@swift.org">swift-users@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-users" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-users</a><br>
</blockquote></div><br></div></div></div>