<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Nov 24, 2017, at 3:11 PM, Matthew Johnson via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">As mentioned in my prior message, I currently have a PR open to update the generics manifesto (<a href="https://github.com/apple/swift/pull/13012" class="">https://github.com/apple/swift/pull/13012</a>). &nbsp;I removed one topic from that update at Doug Gregor’s request that it be discussed on the list first. &nbsp;</div><div class=""><br class=""></div><div class="">The idea is to add the ability to make default arguments conditional (i.e. depend on generic constraints). &nbsp;It is currently possible to emulate conditional default arguments using an overload set. &nbsp;This is verbose, especially when several arguments are involved. &nbsp;Here is an example use case using the overload method to emulate this feature:</div><div class=""><br class=""></div><div class="">```swift</div><div class="">protocol Resource {</div><div class="">&nbsp; associatedtype Configuration</div><div class="">&nbsp; associatedtype Action</div><div class="">}</div><div class="">struct ResourceDescription&lt;R: Resource&gt; {</div><div class="">&nbsp; func makeResource(with configuration: R.Configuration, actionHandler: @escaping (R.Action) -&gt; Void) -&gt; R {</div><div class="">&nbsp; &nbsp; // create a resource using the provided configuration</div><div class="">&nbsp; &nbsp; // connect the action handler</div><div class="">&nbsp; &nbsp; // return the resource</div><div class="">&nbsp; }</div><div class="">}</div><div class=""><br class=""></div><div class="">extension ResourceDescription where R.Configuration == Void {</div><div class="">&nbsp; func makeResource(actionHandler: @escaping (R.Action) -&gt; Void) -&gt; R {</div><div class="">&nbsp; &nbsp; return makeResource(with: (), actionHandler: actionHandler)</div><div class="">&nbsp; }</div><div class="">}</div><div class=""><br class=""></div><div class="">extension ResourceDescription where R.Action == Never {</div><div class="">&nbsp; func makeResource(with configuration: R.Configuration) -&gt; R {</div><div class="">&nbsp; &nbsp; return makeResource(with: configuration, actionHandler: { _ in })</div><div class="">&nbsp; }</div><div class="">}</div><div class=""><br class=""></div><div class="">extension ResourceDescription where R.Configuration == Void, R.Action == Never {</div><div class="">&nbsp; func makeResource() -&gt; R {</div><div class="">&nbsp; &nbsp; return makeResource(with: (), actionHandler: { _ in })</div><div class="">&nbsp; }</div><div class="">}</div><div class=""><br class=""></div><div class="">```</div><div class=""><br class=""></div><div class="">Adding language support for defining these more directly would eliminate a lot of boilerplate and reduce the need for overloads. </div></div></div></blockquote><div><br class=""></div><div>If one could refer to `self` in a default argument (which is not a big problem), you could turn the default into a requirement itself… although it doesn’t *quite* work with your example as written because it would always need to be implemented somehow:</div><div><br class=""></div><div><blockquote type="cite" class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;"><div class="">protocol Resource {</div><div class="">&nbsp; associatedtype Configuration</div><div class="">&nbsp; associatedtype Action</div></div></blockquote>&nbsp; &nbsp; func defaultConfiguration() -&gt; Configuration</div><div>&nbsp; &nbsp; func defaultHandler() -&gt; ((R.Action) -&gt; Void)<br class=""><blockquote type="cite" class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;"><div class="">}</div></div></blockquote></div><div><br class=""></div><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">&nbsp;Doug mentioned that it may also help simplify associated type inference (<a href="https://github.com/apple/swift/pull/13012#discussion_r152124535" class="">https://github.com/apple/swift/pull/13012#discussion_r152124535</a>).</div></div></div></blockquote><br class=""></div><div>Oh, I thought this was something related to choosing a defaults for associated types, which might have helped with my current associated-type-inference quandary. The topic you actually wanted to discuss is disjoint (sorry).</div><div><br class=""></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>- Doug</div><div><br class=""></div><br class=""></div></body></html>