<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="">Am 23.05.2016 um 18:08 schrieb Austin Zheng &lt;<a href="mailto:austinzheng@gmail.com" class="">austinzheng@gmail.com</a>&gt;:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=us-ascii" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><blockquote type="cite" class=""><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">I think that *all* methods should be available - at least in principle - with associated types&nbsp;</span><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">- replaced by their upper bounds (i.e. Any if no constraints have been given either by the protocol definition itself or th existential) if in covariant position and&nbsp;</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">- replaced by their lower bounds if in contravariant position</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">As it is not possible to define lower bounds in Swift, the lower bounds are always the bottom type (called `Nothing` in Swift and not be confused with optionals). The bottom type has no members and therefore a method referencing that type cannot be called and is effectively not available.</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div></blockquote><div class=""><br class=""></div><div class="">Thanks for the feedback! So methods that have associated types in contravariant position would have those types be Nothing, unless there was a concrete type bound to that associated type in the Any's where clause?</div><div class=""><br class=""></div><div class="">Example</div><div class=""><br class=""></div><div class="">protocol MyProtocol {</div><div class="">&nbsp; associatedtype AssocType1</div><div class="">&nbsp; associatedtype AssocType2</div><div class="">&nbsp; func foo(x: AssocType1, y: AssocType2)</div><div class="">}</div><div class=""><br class=""></div><div class="">let a : Any&lt;MyProtocol&gt;</div><div class="">// on 'a', foo is exposed as 'foo(x: Nothing, y: Nothing)', and can thus not be called</div><div class=""><br class=""></div><div class="">let b : Any&lt;MyProtocol where .AssocType1 == Int&gt;</div><div class="">// on 'b', foo is exposed as 'foo(x: Int, y: Nothing)' and still can't be called</div><div class=""><br class=""></div><div class="">let c : Any&lt;MyProtocol where .AssocType1 == Int, .AssocType2 == String&gt;</div><div class="">// on 'c', foo is exposed as 'foo(x: Int, y: String)', and can therefore be called</div><div class=""><br class=""></div><div class="">Let me know if this is what you had in mind.</div></div></div></div></blockquote><div><br class=""></div>Yes, that’s what I had in mind.&nbsp;</div><div><br class=""></div><div>IMHO this would make for simple rules and if Swift might one day get the ability to specify lower bounds this would easily fit in (I don’t know how useful that would be in reality, but I think Scala allows the declaration of lower bounds).</div><div><br class=""></div><div>-Thorsten</div><br class=""></body></html>