A switch
declaração, sob o capô, usa o ~=
operador. Então, é isso:
let x = 2
switch x {
case 1: print(1)
case 2: print(2)
case 3..<5: print(3..<5)
default: break
}
Desugars para isso:
if 1 ~= x { print(1) }
else if 2 ~= x { print(2) }
else if 3..<5 ~= x { print(3..<5) }
else { }
Se você olhar para a referência da biblioteca padrão, ela poderá dizer exatamente o que a ~=
sobrecarga deve fazer : incluída é a correspondência de intervalo e a equivalência para coisas equitativas. (Não incluído é a correspondência enum-case, que é um recurso de idioma, e não uma função na lib std)
Você verá que ele não corresponde a um booleano direto no lado esquerdo. Para esse tipo de comparação, você precisa adicionar uma declaração where.
A menos que você sobrecarregue o ~=
operador você mesmo. (Isso geralmente não é recomendado) Uma possibilidade seria algo como isto:
func ~= <T> (lhs: T -> Bool, rhs: T) -> Bool {
return lhs(rhs)
}
Portanto, isso corresponde a uma função que retorna um booleano à esquerda para seu parâmetro à direita. Aqui está o tipo de coisa para a qual você poderia usá-lo:
func isEven(n: Int) -> Bool { return n % 2 == 0 }
switch 2 {
case isEven: print("Even!")
default: print("Odd!")
}
Para o seu caso, você pode ter uma declaração parecida com esta:
switch someVar {
case isNegative: ...
case 0: ...
case isPositive: ...
}
Mas agora você precisa definir novas isNegative
e isPositive
funções. A menos que você sobrecarregue mais alguns operadores ...
Você pode sobrecarregar operadores de infixo normais para serem operadores de prefixo ou pós-fixado. Aqui está um exemplo:
postfix operator < {}
postfix func < <T : Comparable>(lhs: T)(_ rhs: T) -> Bool {
return lhs < rhs
}
Isso funcionaria assim:
let isGreaterThanFive = 5<
isGreaterThanFive(6) // true
isGreaterThanFive(5) // false
Combine isso com a função anterior, e sua instrução switch pode ser assim:
switch someVar {
case 0< : print("Bigger than 0")
case 0 : print("0")
default : print("Less than 0")
}
Agora, você provavelmente não deveria usar esse tipo de coisa na prática: é um pouco desonesto. Você (provavelmente) está melhor aderindo à where
declaração. Dito isto, o padrão de instrução switch de
switch x {
case negative:
case 0:
case positive:
}
ou
switch x {
case lessThan(someNumber):
case someNumber:
case greaterThan(someNumber):
}
Parece bastante comum para que valha a pena considerar.