2016-08-02 7 views
5

Neugierig, wenn es eine Möglichkeit gibt, in Swift zu tun.Swift Switch-Muster mit Arrays

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 
} 

Ich verstehe, es gibt auch andere Möglichkeiten, wie ich diese erfundene Beispiel Arbeit machen könnte wie case 4, 5, 6: oder kein Schalter und stattdessen mit bar.contains(value) aber ich bin auf der Suche nach einer Lösung, die speziell Schaltmuster auf einen Array Anpassung beteiligt ist. Vielen Dank!

Antwort

16

Sie können einen benutzerdefinierten Pattern-Matching Operator ~= definieren, die ein Array als "Muster" nimmt und einen Wert:

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 
} 

ähnliche Betreiber existieren bereits z.B. für Intervalle:

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

Schön. Ich wünschte, ich hätte daran gedacht. – Abizern

13

Wie sei:

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

Ich denke, das ist die Lösung ist leichter zu verstehen als die angenommene Antwort. Vielen Dank! :) –

Verwandte Themen