> On Jul 25, 2017, at 4:02 PM, Xiaodi Wu <[email protected]> wrote: > > Default values for associated types are approved for Swift 4. They just > haven’t been implemented.
Ahh, I had forgotten that. Thanks for clarifying! :) > > > On Tue, Jul 25, 2017 at 16:02 Matthew Johnson via swift-evolution > <[email protected] <mailto:[email protected]>> wrote: >> On Jul 25, 2017, at 3:26 PM, David Sweeris via swift-evolution >> <[email protected] <mailto:[email protected]>> wrote: >> >> >> On Jul 25, 2017, at 12:38, Robert Bennett via swift-evolution >> <[email protected] <mailto:[email protected]>> wrote: >> >>> Currently if you have the following enum: >>> >>> enum E<T> { >>> case c(T) >>> } >>> >>> then if T is Void, you have to write one of the following: >>> >>> let x: E<Void> = .c(Void()) >>> let y: E<Void> = .c(()) >>> >>> Looks awkward, no? In this case you can omit `<Void>` after `E` because it >>> can be inferred, but if writing a (non-generic) function taking an argument >>> of type `E<Void>`, then the `<Void>` cannot be omitted, and you still have >>> to write `.c(())` for the case name. >>> >>> I’m proposing that for enum cases with a single associated value of Void >>> type, or of a generic type that is equal to Void in some instance, you may >>> omit the parentheses altogether and merely write >>> >>> let x: E<Void> = .c >>> >>> The rationale is twofold: first, double parentheses just looks bad; second, >>> there is only a single value of type Void, which means the associated value >>> of `.c` is trivially inferable, and hence should be omissible. >>> >>> I am not proposing that a bare `E.c` imply a type of `E<Void>` — `E.c` >>> should still be illegal in the absence of specification of the generic type >>> — only that when the type is known to be `E<Void>`, `.c` can replace >>> `.c(())`. >>> >>> Thoughts? >> >> My first response is +1 >> >> My second response is to ask just how much would it break things to expand >> this and allow omitting the argument anywhere its type is known to be Void? >> Maybe by implicitly providing a default value of `()` wherever there's a >> `Void` argument? Like make `func foo(x: Void) {...}` implicitly become `func >> foo(x: Void = ()) {...}`? I have a sneaking suspicion that this question's >> already been asked, but I'm not sure. > > I think default arguments for associated values have come up before. I would > love to see that added someday. > >> >> - Dave Sweeris >> _______________________________________________ >> swift-evolution mailing list >> [email protected] <mailto:[email protected]> >> https://lists.swift.org/mailman/listinfo/swift-evolution >> <https://lists.swift.org/mailman/listinfo/swift-evolution> > _______________________________________________ > swift-evolution mailing list > [email protected] <mailto:[email protected]> > https://lists.swift.org/mailman/listinfo/swift-evolution > <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________ swift-evolution mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-evolution
