Die switch
Anweisung unter der Haube verwendet den ~=
Operator. Also das:
let x = 2
switch x {
case 1: print(1)
case 2: print(2)
case 3..<5: print(3..<5)
default: break
}
Desugars dazu:
if 1 ~= x { print(1) }
else if 2 ~= x { print(2) }
else if 3..<5 ~= x { print(3..<5) }
else { }
Wenn Sie sich die Standardbibliotheksreferenz ansehen, können Sie genau ~=
wissen , wozu die überladen ist : Enthalten ist die Bereichsanpassung und das Gleichsetzen für gleichwertige Dinge. (Nicht enthalten ist der Enum-Case-Matching, bei dem es sich eher um eine Sprachfunktion als um eine Funktion in der Standardbibliothek handelt.)
Sie werden sehen, dass es nicht mit einem geraden Booleschen Wert auf der linken Seite übereinstimmt. Für diese Art von Vergleichen müssen Sie eine where-Anweisung hinzufügen.
Es sei denn ... Sie überlasten den ~=
Bediener selbst. (Dies wird im Allgemeinen nicht empfohlen.) Eine Möglichkeit wäre etwa diese:
func ~= <T> (lhs: T -> Bool, rhs: T) -> Bool {
return lhs(rhs)
}
Das entspricht also einer Funktion, die links einen Booleschen Wert an ihren Parameter rechts zurückgibt. Hier ist die Art von Dingen, für die Sie es verwenden könnten:
func isEven(n: Int) -> Bool { return n % 2 == 0 }
switch 2 {
case isEven: print("Even!")
default: print("Odd!")
}
Für Ihren Fall haben Sie möglicherweise eine Aussage, die folgendermaßen aussieht:
switch someVar {
case isNegative: ...
case 0: ...
case isPositive: ...
}
Aber jetzt müssen Sie neue isNegative
und isPositive
Funktionen definieren . Es sei denn, Sie überlasten einige weitere Operatoren ...
Sie können normale Infix-Operatoren überladen, um Curry-Präfix- oder Postfix-Operatoren zu sein. Hier ist ein Beispiel:
postfix operator < {}
postfix func < <T : Comparable>(lhs: T)(_ rhs: T) -> Bool {
return lhs < rhs
}
Das würde so funktionieren:
let isGreaterThanFive = 5<
isGreaterThanFive(6) // true
isGreaterThanFive(5) // false
Kombinieren Sie dies mit der früheren Funktion, und Ihre switch-Anweisung kann folgendermaßen aussehen:
switch someVar {
case 0< : print("Bigger than 0")
case 0 : print("0")
default : print("Less than 0")
}
Jetzt sollten Sie so etwas in der Praxis wahrscheinlich nicht verwenden: Es ist ein bisschen zwielichtig. Sie sind (wahrscheinlich) besser dran, sich an die where
Aussage zu halten. Das heißt, das switch-Anweisungsmuster von
switch x {
case negative:
case 0:
case positive:
}
oder
switch x {
case lessThan(someNumber):
case someNumber:
case greaterThan(someNumber):
}
Scheint häufig genug zu sein, um eine Überlegung wert zu sein.