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
> <[email protected]> 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
>> <[email protected] <mailto:[email protected]>> 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
>> [email protected] <mailto:[email protected]>
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>
> _______________________________________________
> swift-evolution mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution