[swift-evolution] Evaluating the case of an enum with associated values as a bool

Charles Augustine hyllus04 at gmail.com
Wed Dec 20 12:30:28 CST 2017


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> 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 <mailto:swift-evolution at swift.org>> 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/>
>> 
>> ---------
>> 
>> 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 <mailto:swift-evolution at swift.org>
>> 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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20171220/b812219b/attachment.html>


More information about the swift-evolution mailing list