在确定枚举的关联类型时,您(现在?Swift5?)可以将 "if case" 写为布尔值吗?

Can you (now? Swift5?) write "if case" as a boolean when determining an enum's associated type?

假设您需要确定枚举的实际关联类型。

所以,像

这样的情况
enum MessageItem: Decodable {

    case a(Images)
    case b(Text)
    case c(Reply)
    ...
}

我曾经有过这样的代码

       xSome = x.filter {
            switch [=12=] {
            case .a(_):
                return false
            case .b(_):
                return true
            case .c(_):
                return true
            }
        }

但是这样的代码是可能的

       xSome = x.filter {
            if case .a = [=13=] { return false }
            return true
        }

现在有什么方法可以 Swift 与生成布尔值的关联类型进行比较吗?

所以,类似于:

       xSome = x.filter {
            return (case .a = [=14=])
        }

所以,像 anEnum.is( .someCase )

Swift现在有这样的东西吗?

(当然,我的意思是不在枚举中添加 var,当然你可以这样做。)

如果您将具有关联值的枚举声明为 Equatable,则它们是 Equatable。这是比赛的状态:

enum MyEnum : Equatable {
    case hey
    case ho
    case heyNonnyNo(String)
}
let e = MyEnum.hey
e == .hey // true
e == .ho // false
// e == .heyNonnyNo // blap, illegal

let e2 = MyEnum.heyNonnyNo("hello")
e2 == .heyNonnyNo("hello") // true
e2 == .heyNonnyNo("goodbye") // true

为什么 e == .heyNonnyNo 是非法的?因为不清楚这意味着什么。这种情况具有关联的价值;它的值 关联值。所以我们可以检查这个case的两个实例是否有相同的关联值,但是我们不能只问(使用==)一个实例是否是some this的关联值案例.

所以如果那是我们想知道的,我们回到if case:

if case .heyNonnyNo = e2 {
    print("it's a hey nonny no")
}

但是你不能说没有 if(用于条件),因为 if case 是关键字; case 不能单独存在。如果你真的需要一个 Bool,你可以这样写:

let ok : Bool = {
    switch e2 {
    case .heyNonnyNo: return true
    default: return false
    }
}()