2016-08-02 4 views
5

Ciekawe, jeśli w Swift można wykonać następujące czynności.Przełączanie wzoru przełącznika Swift z tablicami

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 
} 

Rozumiem, że istnieją inne sposoby mogę uczynić to contrived przykład prace takie jak case 4, 5, 6: lub nie za pomocą przełącznika i zamiast przy użyciu bar.contains(value) ale szukam rozwiązania specjalnie udziałem wzór wyłącznik pasujący do tablicy. Dzięki!

Odpowiedz

16

Można zdefiniować operator zwyczaj pasujący wzorzec ~= która pobiera tablicę jako „wzór” i wartość:

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 
} 

Podobne podmioty istnieją już na przykład dla przedziałów czasowych:

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

Nice. Szkoda, że ​​nie pomyślałem o tym. – Abizern

13

Jak o:

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

Myślę, że to rozwiązanie jest łatwiejsze do zrozumienia niż zaakceptowana odpowiedź. Dzięki! :) –