<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="">One of the things that threw me when starting with Swift was the inability to use many protocols as types, e.g- being unable to declare: [SequenceType], instead having to do: [AnySequence]<div class=""><br class=""></div><div class="">And I guess it got me wondering; why can’t we just have these be auto-generated and used where we would expect a protocol to fit? Writing type-erased wrappers currently involves a lot of boilerplate, especially for a type with a lot of methods and/or properties, so automating this would be very useful.</div><div class=""><br class=""></div><div class="">For me there are two good options:</div><div class=""><br class=""></div><div class=""><b class="">Autogenerate for All Types</b>: As it says; every protocol would have an identically named type-erasure (with the same visibility etc.) that Swift would just swap in where appropriate. For example:</div><div class=""><br class=""></div><div class=""><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space:pre">        </span>protocol Foo { … }</font></div><div class=""><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space:pre">        </span>let myArray:[Foo]<span class="Apple-tab-span" style="white-space:pre">        </span>// Array of type-erased wrappers of Foo</font></div><div class=""><div class=""><br class=""></div><div class=""><b class="">Autogenerate by Attribute</b>: Same basic idea, except that an attribute would be required to specify which protocols get automatic type-erasure like so:</div></div><div class=""><br class=""></div><div class=""><div class=""><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space: pre;">        </span>@autoErasure protocol Foo { … }</font></div><div class=""><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space: pre;">        </span>let myArray:[Foo]<span class="Apple-tab-span" style="white-space: pre;">        </span>// Array of type-erased wrappers of Foo</font></div></div><div class=""><font face="Monaco" class=""><br class=""></font></div><div class=""><font face="Monaco" class=""><br class=""></font></div>I’m curious for people’s thoughts on the matter. I know that I for one am tired of defining type-erased wrappers that are just a heap of boiler-plate to properly wrap an instance. It’s also something I’ve seen people doing wrong (and done wrong myself), for example by using closures to invoke methods on an instance; this is a much more elegant looking solution but very quickly bloats the size of the type-erased wrapper compared to more correct boxing method (though for single method protocols it may be fine). It seems like something that would be good to take out of the hands of developers who mostly don’t want to have to define these in the first place, though of course the capability to defining customised versions would remain if anyone actually needs it.<div class=""><br class=""></div><div class="">I’m particularly curious about other features in discussion or that are upcoming that may affect this, as I’m sure I’ll have missed some. Anything that might render this obsolete (or less necessary)? Also whether anyone thinks it could be a bad idea to essentially hide the type-erasure.</div></body></html>