2016-08-02 23 views
5

好奇心是否有辦法在Swift中執行以下操作。與數組匹配的Swift開關模式

let foo = [1, 2, 3] 
let bar = [4, 5, 6] 

let value = 5 

switch value { 
case in foo 
    print("5 is in foo") 
case in bar 
    print("5 is in bar") 
default: 
    break 
} 

我明白還有其他方法我能做出這樣人爲的例子的工作,如case 4, 5, 6:或不使用開關和代替使用bar.contains(value)但我正在尋找具體涉及開關模式匹配到一個數組中的溶液。謝謝!

回答

16

你可以自定義一個模式匹配操作 ~=這需要一個數組作爲「模式」和值:已經存在

func ~=<T : Equatable>(array: [T], value: T) -> Bool { 
    return array.contains(value) 
} 

let foo = [1, 2, 3] 
let bar = [4, 5, 6] 

let value = 5 

switch value { 
case foo: 
    print("\(value) is in foo") 
case bar: 
    print("\(value) is in bar") 
default: 
    break 
} 

類似的運營商例如間隔:

public func ~=<I : IntervalType>(pattern: I, value: I.Bound) -> Bool 
+1

不錯。希望我能想到這一點。 – Abizern

13

如何:

let foo = [1, 2, 3] 
let bar = [4, 5, 6] 

let value = 5 

switch value { 
case _ where foo.contains(value): 
    print("\(value) is in foo") 
case _ where bar.contains(value): 
    print("\(value) is in bar") 
default: 
    print("\(value) is not in foo or bar") 
} 
+0

我認爲這是解決方案比接受的答案更容易理解。謝謝! :) –