<div dir="ltr">Would that synthesize an isY() even though .Y has an associated value there?<div><br><div>enum E {</div><div> case X</div><div> case Y(Int?)</div><div>}</div><div><br></div><div>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.</div></div><div><br></div><div>let value1 = E.Y(1)</div><div>let value2 = E.Y(2)<br></div><div><br></div><div>value1 == value2 // false</div><div>value1 [is the same case as] value 2 // how do I get this?</div><div><br></div><div>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.</div><div><br></div><div>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. </div><div><br></div><div>Ex: </div><div><br></div><div>case(of: value1) == .Y // true</div><div>case(of: value1) == .X // false</div><div>case(of: value1) == case(of: value2) // true</div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Dec 20, 2017 at 1:31 PM Chris Lattner <<a href="mailto:clattner@nondot.org">clattner@nondot.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">In the past, we’ve discussed synthesizing predicate members onto enums. E.g. given:<div><br></div><div>enum E {</div><div> case X</div><div> case Y(Int)</div><div>}</div><div><br></div><div>you’d get something like:</div><div><br></div><div>extension E {</div><div> func isX() -> Bool { return self == .X }</div><div> func getY() -> Int? { … }</div><div>}</div><div><br></div><div>which would solve the client side of this nicely.</div><div><br></div><div>-Chris</div><div><br></div><div><br></div><div><br><div><blockquote type="cite"></blockquote></div></div></div><div style="word-wrap:break-word"><div><div><blockquote type="cite"><div>On Dec 20, 2017, at 11:24 AM, Ethan Diamond via swift-evolution <<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>> wrote:</div><br class="m_7271590183074468783Apple-interchange-newline"></blockquote></div></div></div><div style="word-wrap:break-word"><div><div><blockquote type="cite"><div><div dir="ltr">Sorry all for attaching the original post to the Non-Exhaustive enums thread. I"m moving it down to it's own thread. <div><div><br></div><div>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:</div><div><div>
<br class="m_7271590183074468783webkit-block-placeholder"></div><p class="m_7271590183074468783inbox-inbox-p1">if<span class="m_7271590183074468783inbox-inbox-s1"> </span>case<span class="m_7271590183074468783inbox-inbox-s1"> .</span><span class="m_7271590183074468783inbox-inbox-s2">search</span><span class="m_7271590183074468783inbox-inbox-s1"> = presenter.</span><span class="m_7271590183074468783inbox-inbox-s2">state</span><span class="m_7271590183074468783inbox-inbox-s1"> { </span>return<span class="m_7271590183074468783inbox-inbox-s1"> </span>true<span class="m_7271590183074468783inbox-inbox-s1"> } </span>else<span class="m_7271590183074468783inbox-inbox-s1"> { </span>return<span class="m_7271590183074468783inbox-inbox-s1"> </span>false<span class="m_7271590183074468783inbox-inbox-s1"> }</span></p></div><div>Side note: Thanks Kevin, didn't know you could nest enums in switches like that. Super helpful!<br></div><div><br></div><div>------------------------------------------------------</div><div><pre style="white-space:pre-wrap">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
><i> On Dec 20, 2017, at 9:55 AM, Kevin Nattinger via swift-evolution <<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">swift-evolution at swift.org</a>> wrote:
</i>><i>
</i>><i> 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.
</i>><i>
</i>><i> Sidenote, your `switch` example is actually trivial with existing syntax:
</i>><i>
</i>><i> switch enumeration {
</i>><i> case .a(.c(let param)): // or just .a(.c) if you don't need the value
</i>><i> print(param)
</i>><i> default:
</i>><i> break
</i>><i> }
</i>><i>
</i>><i> I use this from time to time switching over, e.g., optional enums.
</i>><i>
</i>><i> *: ugliest syntax ever, and it can't even be used as a standalone expression.
</i>><i>
</i>><i>
</i>>><i> On Dec 20, 2017, at 8:44 AM, Ethan Diamond via swift-evolution <<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">swift-evolution at swift.org</a> <mailto:<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">swift-evolution at swift.org</a>>> wrote:
</i>>><i>
</i>>><i> Hello everyone,
</i>>><i>
</i>>><i> 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:
</i>>><i>
</i>>><i> enum Enum {
</i>>><i> case a(param: String)
</i>>><i> case b(param: String)
</i>>><i> }
</i>>><i>
</i>>><i> let enumeration: Enum = a(param: "Hi")
</i>>><i> switch enumeration {
</i>>><i> case a:
</i>>><i> // Do something
</i>>><i> case b:
</i>>><i> // Do something
</i>>><i> }
</i>>><i>
</i>>><i> We'e been given the ability in the context of an if statement:
</i>>><i>
</i>>><i> enum Enum {
</i>>><i> case a(param: String)
</i>>><i> case b(param: String)
</i>>><i> }
</i>>><i>
</i>>><i> let enumeration: Enum = a(param: "Hi")
</i>>><i>
</i>>><i> if case .a = enumeration {
</i>>><i> // Do something
</i>>><i> }
</i>>><i>
</i>>><i> 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:
</i>>><i>
</i>>><i> Where statements:
</i>>><i>
</i>>><i> enum Enum {
</i>>><i> case a(param: Enum2)
</i>>><i> case b(param: Enum2)
</i>>><i> }
</i>>><i>
</i>>><i> enum Enum2 {
</i>>><i> case c(param: String)
</i>>><i> case d(param: String)
</i>>><i> }
</i>>><i>
</i>>><i> let enumeration: Enum = a(param: "Hi")
</i>>><i> switch enumeration {
</i>>><i> case a(let inner) where [INNER CASE IS .c]
</i>>><i> }
</i>>><i>
</i>>><i> ---------
</i>>><i>
</i>>><i> Filter an array for a certain case:
</i>>><i>
</i>>><i> Expertly explained by Erica Sadun here: <a href="http://ericasadun.com/2017/01/31/challenge-filtering-associated-value-enumeration-arrays/" target="_blank">http://ericasadun.com/2017/01/31/challenge-filtering-associated-value-enumeration-arrays/</a> <<a href="http://ericasadun.com/2017/01/31/challenge-filtering-associated-value-enumeration-arrays/" target="_blank">http://ericasadun.com/2017/01/31/challenge-filtering-associated-value-enumeration-arrays/</a>>
</i>>><i>
</i>>><i> ---------
</i>>><i>
</i>>><i> Nicely set a UIButton to hidden if an enum is a certain case:
</i>>><i>
</i>>><i> enum State {
</i>>><i> case `default`
</i>>><i> case searching(results: [Result])
</i>>><i> }
</i>>><i>
</i>>><i> myButton.isHidden = [STATE IS .searching]
</i>>><i>
</i>>><i> ---------
</i>>><i>
</i>>><i> 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:
</i>>><i>
</i>>><i> enum Enum {
</i>>><i> case a(param: String)
</i>>><i> case b(param: String)
</i>>><i> }
</i>>><i>
</i>>><i> let enumeration: Enum = a(param: "Hi")
</i>>><i>
</i>>><i> case .a = enumeration // Bool
</i>>><i> case .a(let param) = enumeration // Bool, assigns "Hi" to "param"
</i>>><i>
</i>>><i> Thanks!
</i>>><i> Ethan
</i>>><i>
</i>>><i> _______________________________________________
</i>>><i> swift-evolution mailing list
</i>>><i> <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">swift-evolution at swift.org</a> <mailto:<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">swift-evolution at swift.org</a>>
</i>>><i> <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a>
</i>><i>
</i>><i> _______________________________________________
</i>><i> swift-evolution mailing list
</i>><i> <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">swift-evolution at swift.org</a>
</i>><i> <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a></i></pre></div></div></div></div></blockquote></div></div></div><div style="word-wrap:break-word"><div><div><blockquote type="cite"><div>
_______________________________________________<br>swift-evolution mailing list<br><a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br></div></blockquote></div><br></div></div></blockquote></div>