如何从 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
(注意:枚举是类型,应始终大写)
类似于此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
(注意:枚举是类型,应始终大写)