我有enum
一些case
,以及一个包含此enum
实例的数组,例如:
enum MyEnum {
case foo(Int)
case bar(Int)
case baz(Int)
}
let myArray = [
MyEnum.foo(1),
MyEnum.bar(2),
MyEnum.baz(3)
]
然后,我需要比较该数组的确定元素foo
,baz
或baz
,例如:
myArray.filter { $0 == .foo } // not work, and should need return [MyEnum.foo(1)]
我可以使用switch
:
myArray.filter {
switch $0 {
case .foo(_):
return true
default:
return false
}
} // work, and return [MyEnum.foo(1)]
但是,我希望解决方案更简洁,并且更多地了解enum
。
答案 0 :(得分:3)
我能想到的最短的是:
let result = myArray.filter { if case .foo = $0 { return true } else { return false } }
答案 1 :(得分:2)
如前所述,如果案例是一个很好的解决方案,因为swift 2.0。但是,如果您要多次使用同一个过滤器,那么您需要一种更具表现力的方式来实现这一目标。例如,你可以使这个enum equatable隐藏你的switchCase
远离viewController:
extension MyEnum: Equatable{
static func ==(lhs: MyEnum, rhs: MyEnum) -> Bool{
switch (lhs, rhs) {
case (.foo(_), .foo(_)):
return true
case (.bar(_), .bar(_)):
return true
case (.baz(_), .baz(_)):
return true
default:
return false
}
}
}
然后:
myArray.filter {
$0 == .foo(1)
}
答案 2 :(得分:1)
如果真的想要在一行中执行,您可以使用反射:
myArray.filter { Mirror(reflecting: $0).children.first!.label! == "foo" }