[swift-evolution] Evaluating the case of an enum with associated values as a bool
David Hart
david at hartbit.com
Thu Dec 21 04:38:16 CST 2017
> On 20 Dec 2017, at 20:24, Ethan Diamond via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>
> Sorry all for attaching the original post to the Non-Exhaustive enums thread. I"m moving it down to it's own thread.
>
> My understanding is I'm not allowed to write up a proposal unless I have the time to implement it. Is that still true? This is a major pain point for me to avoid having to write things like this:
All proposals need an implementation before they can go through the final review stage, but the proposal author doesn’t also have to be the implementor.
> if case .search = presenter.state { return true } else { return false }
>
> Side note: Thanks Kevin, didn't know you could nest enums in switches like that. Super helpful!
>
> ------------------------------------------------------
> I thought I would add another case that isn’t possible with current syntax (so far as I’m aware). You can’t negate the comparison to do something for all cases except a particular case. You have to have an empty if block and use the else block, or have an empty case in a switch statement and use the default.
>
> enum Enum {
> case a(param: String)
> case b(param: String)
> case c(param: String)
> }
>
> let enumeration: Enum = .a(param: "Hi")
>
> if !(case .a = enumeration) {
> // Do something
> }
>
> — Charles
>
> > On Dec 20, 2017, at 9:55 AM, Kevin Nattinger via swift-evolution <swift-evolution at swift.org <https://lists.swift.org/mailman/listinfo/swift-evolution>> wrote:
> >
> > I agree this would be useful. At the moment I have to hack around it with things like `var isFoo: Bool { if case .foo = self …`* with cases I commonly need, but this is definitely a feature that has come up before and I support. It is potentially related to getting the values through an accessor, which has also come up several times.
> >
> > Sidenote, your `switch` example is actually trivial with existing syntax:
> >
> > switch enumeration {
> > case .a(.c(let param)): // or just .a(.c) if you don't need the value
> > print(param)
> > default:
> > break
> > }
> >
> > I use this from time to time switching over, e.g., optional enums.
> >
> > *: ugliest syntax ever, and it can't even be used as a standalone expression.
> >
> >
> >> On Dec 20, 2017, at 8:44 AM, Ethan Diamond via swift-evolution <swift-evolution at swift.org <https://lists.swift.org/mailman/listinfo/swift-evolution> <mailto:swift-evolution at swift.org <https://lists.swift.org/mailman/listinfo/swift-evolution>>> wrote:
> >>
> >> Hello everyone,
> >>
> >> One major pain point I've run into with Swift is the inability to evaluate the case of an enum that has associated values in a way that just returns a bool. We've been given the ability in a switch statement:
> >>
> >> enum Enum {
> >> case a(param: String)
> >> case b(param: String)
> >> }
> >>
> >> let enumeration: Enum = a(param: "Hi")
> >> switch enumeration {
> >> case a:
> >> // Do something
> >> case b:
> >> // Do something
> >> }
> >>
> >> We'e been given the ability in the context of an if statement:
> >>
> >> enum Enum {
> >> case a(param: String)
> >> case b(param: String)
> >> }
> >>
> >> let enumeration: Enum = a(param: "Hi")
> >>
> >> if case .a = enumeration {
> >> // Do something
> >> }
> >>
> >> But without a basic was of getting a bool for if an enum is a given case, here's a list of things I can't do:
> >>
> >> Where statements:
> >>
> >> enum Enum {
> >> case a(param: Enum2)
> >> case b(param: Enum2)
> >> }
> >>
> >> enum Enum2 {
> >> case c(param: String)
> >> case d(param: String)
> >> }
> >>
> >> let enumeration: Enum = a(param: "Hi")
> >> switch enumeration {
> >> case a(let inner) where [INNER CASE IS .c]
> >> }
> >>
> >> ---------
> >>
> >> Filter an array for a certain case:
> >>
> >> Expertly explained by Erica Sadun here: http://ericasadun.com/2017/01/31/challenge-filtering-associated-value-enumeration-arrays/ <http://ericasadun.com/2017/01/31/challenge-filtering-associated-value-enumeration-arrays/> <http://ericasadun.com/2017/01/31/challenge-filtering-associated-value-enumeration-arrays/ <http://ericasadun.com/2017/01/31/challenge-filtering-associated-value-enumeration-arrays/>>
> >>
> >> ---------
> >>
> >> Nicely set a UIButton to hidden if an enum is a certain case:
> >>
> >> enum State {
> >> case `default`
> >> case searching(results: [Result])
> >> }
> >>
> >> myButton.isHidden = [STATE IS .searching]
> >>
> >> ---------
> >>
> >> I've run into this issue a ton of times because I tend to represent my views a State enums. I haven't seen anything on the board for plans for solving this issue, thought. Has there been any discussion about addressing it? Ideally I'd be able to do this:
> >>
> >> enum Enum {
> >> case a(param: String)
> >> case b(param: String)
> >> }
> >>
> >> let enumeration: Enum = a(param: "Hi")
> >>
> >> case .a = enumeration // Bool
> >> case .a(let param) = enumeration // Bool, assigns "Hi" to "param"
> >>
> >> Thanks!
> >> Ethan
> >>
> >> _______________________________________________
> >> swift-evolution mailing list
> >> swift-evolution at swift.org <https://lists.swift.org/mailman/listinfo/swift-evolution> <mailto:swift-evolution at swift.org <https://lists.swift.org/mailman/listinfo/swift-evolution>>
> >> https://lists.swift.org/mailman/listinfo/swift-evolution <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>
> > https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>_______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org <mailto: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/20171221/f3523b35/attachment.html>
More information about the swift-evolution
mailing list