> On Dec 21, 2017, at 10:19 AM, Ethan Diamond <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?? > 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. > > > > 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