> 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

Reply via email to