2017-03-02 67 views
2

我有一个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

回答

1

如果你真的想这样做,在同一行,你可以使用反射:

myArray.filter { Mirror(reflecting: $0).children.first!.label! == "foo" } 
3

我能想到的最短是:

let result = myArray.filter { if case .foo = $0 { return true } else { return false } } 
+0

'if case .foo = $ 0 ...'works。 – vacawama

+0

@vacawama啊是的,你是对的。 3个字符短 –

+0

'let result = myArray.filter {if case .foo = $ 0 {return true};返回false}' – vacawama

2

仿佛情况下是因为SWIFT 2.0很好地解决前面提到的。但是如果你打算多次使用这个相同的过滤器,那么你需要一个更具表现力的方式来做到这一点。举例来说,你可以让这个枚举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) 
}