> On Nov 24, 2017, at 3:11 PM, Matthew Johnson via swift-evolution
> <[email protected]> wrote:
>
> As mentioned in my prior message, I currently have a PR open to update the
> generics manifesto (https://github.com/apple/swift/pull/13012
> <https://github.com/apple/swift/pull/13012>). I removed one topic from that
> update at Doug Gregor’s request that it be discussed on the list first.
>
> The idea is to add the ability to make default arguments conditional (i.e.
> depend on generic constraints). It is currently possible to emulate
> conditional default arguments using an overload set. This is verbose,
> especially when several arguments are involved. Here is an example use case
> using the overload method to emulate this feature:
>
> ```swift
> protocol Resource {
> associatedtype Configuration
> associatedtype Action
> }
> struct ResourceDescription<R: Resource> {
> func makeResource(with configuration: R.Configuration, actionHandler:
> @escaping (R.Action) -> Void) -> R {
> // create a resource using the provided configuration
> // connect the action handler
> // return the resource
> }
> }
>
> extension ResourceDescription where R.Configuration == Void {
> func makeResource(actionHandler: @escaping (R.Action) -> Void) -> R {
> return makeResource(with: (), actionHandler: actionHandler)
> }
> }
>
> extension ResourceDescription where R.Action == Never {
> func makeResource(with configuration: R.Configuration) -> R {
> return makeResource(with: configuration, actionHandler: { _ in })
> }
> }
>
> extension ResourceDescription where R.Configuration == Void, R.Action ==
> Never {
> func makeResource() -> R {
> return makeResource(with: (), actionHandler: { _ in })
> }
> }
>
> ```
>
> Adding language support for defining these more directly would eliminate a
> lot of boilerplate and reduce the need for overloads.
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:
> protocol Resource {
> associatedtype Configuration
> associatedtype Action
func defaultConfiguration() -> Configuration
func defaultHandler() -> ((R.Action) -> Void)
> }
> Doug mentioned that it may also help simplify associated type inference
> (https://github.com/apple/swift/pull/13012#discussion_r152124535
> <https://github.com/apple/swift/pull/13012#discussion_r152124535>).
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).
- Doug
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution