> On Dec 20, 2017, at 2:12 PM, Ethan Diamond <ethanjdiam...@gmail.com> wrote: > > Would that synthesize an isY() even though .Y has an associated value there?
I’m not aware of a concrete design for this idea. The details would definitely need to be figured out, but I don’t see why a double optional is itself a problem. -Chris > > 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 > <mailto: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 <mailto: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 <mailto:swift-evolution@swift.org> >> 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