[swift-evolution] [Pitch] Small bit of sugar for enum case with Void associated value

Xiaodi Wu xiaodi.wu at gmail.com
Tue Jul 25 16:02:58 CDT 2017


Default values for associated types are approved for Swift 4. They just
haven’t been implemented.


On Tue, Jul 25, 2017 at 16:02 Matthew Johnson via swift-evolution <
swift-evolution at swift.org> wrote:

> On Jul 25, 2017, at 3:26 PM, David Sweeris via swift-evolution <
> swift-evolution at swift.org> wrote:
>
>
> On Jul 25, 2017, at 12:38, Robert Bennett via swift-evolution <
> swift-evolution at swift.org> 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
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170725/7ace67ef/attachment.html>


More information about the swift-evolution mailing list