La switch
declaración, debajo del capó, utiliza el ~=
operador. Así que esto:
let x = 2
switch x {
case 1: print(1)
case 2: print(2)
case 3..<5: print(3..<5)
default: break
}
Desugar a esto:
if 1 ~= x { print(1) }
else if 2 ~= x { print(2) }
else if 3..<5 ~= x { print(3..<5) }
else { }
Si observa la referencia de la biblioteca estándar, puede decirle exactamente para qué ~=
está sobrecargada : se incluye la coincidencia de rango y la ecuación para cosas equiparables. (No se incluye la coincidencia de mayúsculas y minúsculas, que es una característica del lenguaje, en lugar de una función en la biblioteca estándar)
Verá que no coincide con un booleano recto en el lado izquierdo. Para ese tipo de comparaciones, debe agregar una declaración where.
A menos que ... sobrecargues el ~=
operador tú mismo. (Esto generalmente no se recomienda) Una posibilidad sería algo como esto:
func ~= <T> (lhs: T -> Bool, rhs: T) -> Bool {
return lhs(rhs)
}
Entonces, coincide con una función que devuelve un valor booleano a la izquierda a su parámetro a la derecha. Este es el tipo de cosas para las que podría usarlo:
func isEven(n: Int) -> Bool { return n % 2 == 0 }
switch 2 {
case isEven: print("Even!")
default: print("Odd!")
}
Para su caso, es posible que tenga una declaración que se vea así:
switch someVar {
case isNegative: ...
case 0: ...
case isPositive: ...
}
Pero ahora tienes que definir nuevas isNegative
y isPositive
funciones. A menos que sobrecargue algunos operadores más ...
Puede sobrecargar los operadores de infijo normales para ser operadores de prefijo o postfix curry. Aquí hay un ejemplo:
postfix operator < {}
postfix func < <T : Comparable>(lhs: T)(_ rhs: T) -> Bool {
return lhs < rhs
}
Esto funcionaría así:
let isGreaterThanFive = 5<
isGreaterThanFive(6) // true
isGreaterThanFive(5) // false
Combine eso con la función anterior, y su declaración de cambio puede verse así:
switch someVar {
case 0< : print("Bigger than 0")
case 0 : print("0")
default : print("Less than 0")
}
Ahora, probablemente no deberías usar este tipo de cosas en la práctica: es un poco dudoso. Es (probablemente) mejor seguir con la where
declaración. Dicho esto, el patrón de declaración de cambio de
switch x {
case negative:
case 0:
case positive:
}
o
switch x {
case lessThan(someNumber):
case someNumber:
case greaterThan(someNumber):
}
Parece lo suficientemente común como para que valga la pena considerarlo.