> On Dec 21, 2017, at 10:59 AM, Dave Abrahams <dabrah...@apple.com> wrote:
> 
> 
> 
>> On Dec 21, 2017, at 10:19 AM, Ethan Diamond <ethanjdiam...@gmail.com 
>> <mailto:ethanjdiam...@gmail.com>> wrote:
>> 
>> Just to clarify, Dave -
>> 
>> What happens there if one case has associated values
> 
>> and one has an associated value thats an optional? 
>> 
>> Enum A {
>>    case x(String?)
>>    case y
>> }
>> 
>> let a = A.x(nil)
> 
> A.x is String??

This was assigning .x to a, not evaluating a synthesized value

> 
>> a.y // What's the result?
> 
> nil as Optional<Void>
> 
>> a.x // Would produce a double optional, which are clumsy to nil check
> 
> They’re a fact of life.  If that’s a problem, we should consider fixing it, 
> but it’s orthogonal to this one.
> 
>> 
>> I'm not a fan of solving this via synthesis in general. We have metatypes 
>> for classes/structs/protocols, which are useful in all sorts of situations. 
>> Cases are essentially "types" of enums. Why not have case metatypes? They're 
>> useful for the same reasons class types are, and there's already precedence 
>> in the language for syntax.
> 
> You mean “precedent?”  OK, but I don’t see how it helps with any of the same 
> problems as synthesized properties for cases do.
> 

I’m not really sure what the problems synthesized properties are trying to 
solve are. Chris brought them up as a possible solution to my pain point, which 
they only solve partially. Checking for a case I don’t know up front (for 
example, comparing the cases of two values) still isn’t covered. 

>> 
>> 
>> 
>> On Thu, Dec 21, 2017 at 7:14 AM Dave Abrahams <dabrah...@apple.com 
>> <mailto:dabrah...@apple.com>> wrote:
>> IIRC what we discussed was synthesizing  members of type Optional<Payload> 
>> which could then be checked against nil. 
>> 
>> if _ = x.failure { ... }
>> if x.failure != nil { ... }
>> if let r = x.success {...}
>> 
>> IMO synthesizing predicates would be a huge missed opportunity by comparison
>> 
>> Sent from my iPhone
>> 
>> On Dec 20, 2017, at 1:31 PM, Chris Lattner via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.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 <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