Would that synthesize an isY() even though .Y has an associated value there?

enum E {
    case X
    case Y(Int?)
}

If I had to run that through getY() -> Int??, it still wouldn't be quite
what I was looking for with regards to intent. If you are planning an doing
an isY though, that would work for most cases where you're evaluating for a
given enum and know what it is beforehand. Even so that wouldn't work for a
case, for example, where I'm trying to see if two enums are the same case,
and don't necessarily care if they're equal.

let value1 = E.Y(1)
let value2 = E.Y(2)

value1 == value2 // false
value1 [is the same case as] value 2 // how do I get this?

This would be useful, say, if I was trying to generate a diff of two arrays
of enums, which I occasionally do for table / collection views to figure
out inserts/removals/updates.

I don't necessarily know if it's feasible, but it would be really great to
have something like a Case metatype, the same way we have type(of: ). It
would be great to have a case(of: ) that we can evaluate against the
shorthand like we do in switch statements.

Ex:

case(of: value1) == .Y // true
case(of: value1) == .X // false
case(of: value1) == case(of: value2) // true



On Wed, Dec 20, 2017 at 1:31 PM Chris Lattner <clatt...@nondot.org> wrote:

> In the past, we’ve discussed synthesizing predicate members onto enums.
> E.g. given:
>
> enum E {
>   case X
>   case Y(Int)
> }
>
> you’d get something like:
>
> extension E {
>   func isX() -> Bool { return self == .X }
>   func getY() -> Int? { … }
> }
>
> which would solve the client side of this nicely.
>
> -Chris
>
>
>
> On Dec 20, 2017, at 11:24 AM, Ethan Diamond via swift-evolution <
> swift-evolution@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:
>
> 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@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
>
>
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to