I actually think that new syntax would be worse. It's not obvious what
this does:
On Dec 20, 2017, at 2:12 PM, Ethan Diamond <ethanjdiamond@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 <clattner@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: Challenge: Filtering associated value enumeration arrays — Erica Sadun <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
*> >* _______________________________________________
*>* 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*
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution