对于某些情况,我有一个具有关联值的枚举:
enum Foo {
case a
case b
case c(String?)
}
我还有一个以这个枚举作为变量的结构
struct Bar {
var foo: Foo
}
然后我有一个数组
let array:[Bar] = [Bar(foo: .a), Bar(foo: .c(nil)), Bar(foo: .c("someString"))]
我想创建一个对这个数组的一个子集进行操作的函数,基于它接收到的
func printOnly(objectsWithCase: Foo)
到目前为止,它非常简单,但现在有一个问题:对于这个操作,我想忽略相关的值。
我想使这个函数能够在不提及关联值的情况下接受
.c
大小写,就好像是说“给我带.c
的大小写,而不管关联值是什么”。换言之,我希望传入类似
.c(_)
(当然这不起作用)的内容并将其返回(在本例中打印)同时返回Bar(foo: .c(nil))
和Bar(foo: .c("someString"))
到目前为止,我只想到了更改函数声明以采用过滤闭包,而不是像这样的情况:
func printArray(array: [Bar], condition: (Bar) -> Bool) {
let tmp = array.filter(condition)
print(tmp)
}
我想知道有没有一种方法可以在快速通过箱子而不是条件块的情况下完成?
最佳答案
在模式匹配操作中,可以使用下划线作为通配符:
array.filter {
switch $0.foo {
case .a: return true // keep a
case .b: return false // reject b
case .c(_): return true // keep c, regardless of assoc. value.
}
}