2016-07-12 16 views
2

Betrachten Sie diesen Code ...Gibt es eine einfache Möglichkeit zu testen, ob Sie eine aus einer Reihe von Aufzählungen übereinstimmen?

switch(testValue) 
{ 
    case .ValueA, 
     .ValueB, 
     .ValueC: 

     return 40 

    default: 

     return 0 
} 

Nun war, wenn ich nur für einen einzigen Enumerationswerts Überprüfung, ich das ...

return (testValue == .ValueA) 
    ? 40 
    : 0; 

tun könnte, aber ich frage mich, wie ich haben kann so etwas wie die letztere, aber die Prüfung auf Multiples wie der frühere, ähnlich wie diese Pseudo-Code ...

return (testValue is in [.ValueA, .ValueB, .ValueC]) 
    ? 40 
    : 0; 

ich weiß, dass ich es mit einem Inline-Array tun, wie so ...

return ([SomeEnum.ValueA, .ValueB, .ValueC].Contains(testValue)) 
    ? 40 
    : 0; 

... aber ich hoffe, es gibt etwas noch sauberer. Ist da?

+0

Swift den Typen aus den Variablen ableiten können Sie vergleichen, so 'return ([.ValueA, .ValueB, .ValueC] .contains (Testvalue))? 40: 0' sollte ausreichen. – vacawama

+1

Sie brauchen die Parens auch nicht: 'return [.ValueA, .ValueB, .ValueC] .enthält (testValue)? 40: 0'. – vacawama

+0

Ich finde es sehr interessant, dass wir mehrere Übereinstimmungen für einen einzelnen Fall in einer 'switch' Anweisung (' case .ValueA, .ValueB, .ValueC: ... ') bereitstellen können, während wir (so weit ich kann) tell) kann dies nicht für das äquivalente 'case'-Muster tun, das in einem" if case "-Mustervergleich übereinstimmt. Ich glaubte, dass "falls case" Mustervergleich zu einem einzelnen "case" Muster in einer 'switch' Aussage passt (mit dem einzigen Unterschied, dass das' case' Muster in 'switch' Aussagen die Fälle bezüglich der Vollständigkeit von die 'switch' Aussage, es scheint, dass ich mich geirrt habe? – dfri

Antwort

0
extension SomeEnum { 
    func isOneOf(values: Value...) -> Bool { 
     return values.contains(self) 
    } 
} 

return testValue.isOneOf(.ValueA, .ValueB, .ValueC) ? 40 : 0