如何从 swift 枚举数组中删除一个值

How do I remove a value from swift array of enums

类似于此How to remove an element of a given value from an array in Swift

但对于枚举

我如何删除具有给定枚举的值(原生 swift 枚举 不允许比较)来自这些枚举的数组?

无法将该枚举转换为 Int,因为存在一些参数化情况

示例代码(无法编译):

    enum test
    {
        case foo
        case bar(baz: Locale)
    }

    var arr: [test] = [.foo, .bar(baz: Locale.current)]

    arr = arr.filter({ [=11=] != .foo })

好吧,那不是什么东西。错误信息里就对了。

Binary operator '!=' cannot be synthesized for enums with associated values

快速回答:

arr = arr.filter {
    switch [=11=] {
    case .foo: return true
    default: return false
    }
}

更紧凑的答案:

arr = arr.filter { if case .foo = [=12=] { return true } else { return false } }

更易于维护的答案:

如果 test 中只有几个值,请将逻辑移至枚举中。

extension test {

    var isFoo: Bool {
        switch self {
        case .foo: return true
        default: return false
        }
    }

    var isBar: Bool {
        switch self {
        case .bar: return true
        default: return false
        }
    }

}

arr = arr.filter { [=13=].isFoo }

具有关联值的枚举未隐式标记为 Equatable。你必须要求它。但是,如果关联值本身是 Equatable(我相信从 Swift 4.2 开始),那么这就是您要做的全部。

变化:

enum Test

至:

enum Test: Equatable

(注意:枚举是类型,应始终大写)