A mensagem de erro que você está recebendo, "Expression pattern of type 'Bool' cannot match values of type 'Int'", aparece porque o switch
em Swift espera que os padrões (case
) sejam comparáveis ao valor que está sendo analisado, que no seu exemplo é um Int
. Mas, ao usar expressões booleanas diretamente nos case
, você está fornecendo padrões do tipo Bool
, o que não é compatível com o tipo Int
do valor numero
.
Em Swift, você pode usar o where
para adicionar condições aos casos do switch
, permitindo que você verifique se o número é par ou ímpar. As duas formas que você mencionou:
Utilizando let
para criar uma variável temporária:
switch numero {
case let x where x % 2 == 0:
print("Número \(x) é par")
case let x where x % 2 != 0:
print("Número \(x) é ímpar")
default:
break
}
Utilizando _
para ignorar a criação de uma variável temporária:
switch numero {
case _ where numero % 2 == 0:
print("Número é par")
case _ where numero % 2 != 0:
print("Número é ímpar")
default:
break
}
Ambas as formas são válidas e a escolha entre uma e outra depende de como você pretende usar a variável dentro do case
. No primeiro exemplo, você pode usar a variável x
dentro do bloco print
para interpolar o valor. No segundo exemplo, você não precisa da variável temporária, então o _
é suficiente.
Em outras linguagens, pode ser comum ver algo como:
switch (numero % 2 == 0) {
case true:
print("Número é par")
case false:
print("Número é ímpar")
}
Só que, em Swift, o switch
é projetado para trabalhar diretamente com os valores que correspondem ao tipo da variável analisada, e não com expressões booleanas diretamente.
Espero ter ajudado.
Um abraço e bons estudos.