如何在一行中获得枚举的情况?

时间:2017-03-02 02:18:04

标签: swift enums

我有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)
]

然后,我需要比较该数组的确定元素foobazbaz,例如:

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

3 个答案:

答案 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" }