2016-06-20 9 views
3

Wie würden Sie schreiben diese:complementery einer if Fall

guard case .SomeEnum(3) = enumType where myInt == 3 else { 
    //This is the case I need 
} 

aber ich glaube nicht, dass es sauber ist, da es nicht wirklich ist:

if case .SomeEnum(3) = enumType where myInt == 3 { 
    //I don't need this case 
} else { 
    //This is the case I need 
} 

Ich weiß, ich guard verwenden könnte Ein Fall, in dem die Funktion nicht abgeschlossen werden kann. Außerdem erwartet mich guard von der Funktion zurückzukehren.

Andere Alternativen?

+0

Könnte es nicht einfach 'if sein .SomeEnum! = EnumType || meinInt! = 3'? – Alexander

+0

'.SomeEnum! = EnumType' oder' .SomeEnum == enumType' gibt Compiler Fehler, da die Enums Parameter haben – Daniel

+0

Oh, ich sehe. Gute Frage :) – Alexander

Antwort

3

Sie können kein Muster negiert (soweit ich weiß), und die erste Lösung mit if/else mir gut aussieht, ist die Absicht des Codes deutlich sichtbar.

Eine switch-Anweisung wäre eine Alternative:

switch enumType { 
case .SomeEnum(3) where myInt == 3: 
    break // I don't need this case 
default: 
    // This is the case I need 
    // ... 
} 

Im Hinblick auf Ihre Bemerkung

Auch Wache erwartet mich von der Funktion zurückzukehren.

das ist nicht ganz richtig. Es wird erwartet, dass Sie den aktuellen Umfang verlassen. So würde dies kompilieren und zu arbeiten wie erwartet:

repeat { 
    guard case .SomeEnum(3) = enumType where myInt == 3 else { 
     // This is the case I need 
     // ... 
     break 
    } 
} while false 

aber ich würde, dass eine bessere Lösung nicht in Betracht ziehen.

+0

Ich hatte die gleiche Idee mit 'switch', das * nicht brauchen * Muster ist' case.SomeEnum (Wert) wo Wert == 3 && value == myInt: 'oder vielleicht auch einfach' case .SomeEnum (let Wert) wobei Wert == myInt: ' – vadian

+0

@vadian:' Fall .SomeEnum (3) wo MyInt == 3: 'wäre das gleiche Muster wie in der Frage. –

+0

@vadian: 'case .SomeEnum (let Wert) wo Wert == myInt:' (wenn das ist, was OP eigentlich gemeint ist) kann auf 'case.SomeEnum (myInt) abgekürzt werden:' –

Verwandte Themen