1
resposta

dúvida sobro o uso do switch

Na aula é mostrado as seguintes formas para numero = 20 :

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
}
switch numero {
case _ where numero % 2 == 0: print("Número é par")
case _ where numero % 2 != 0: print("Número é ímpar")
default: break

Por qual motivo não é possível fazer diretamente, como em outras linguagens:

switch numero {
case numero % 2 == 0: print("Número é par")
case numero % 2 != 0: print("Número é ímpar")
default: break
}

Nesse caso aparece a mensagem de erro: Expression pattern of type 'Bool' cannot match values of type 'Int'

1 resposta

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:

  1. 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
    }
    
  2. 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.