Menu
Coddy logo textTech

try? e try!

Parte da seção Lógica e Fluxo do Journey de Swift da Coddy. Lição 46 de 56.

Às vezes você não se importa com qual erro uma função lançou, você apenas quer um resultado ou uma alternativa. O Swift oferece duas formas curtas.

try? transforma qualquer erro lançado em nil. O resultado é um Optional do tipo de retorno da função:

enum E: Error { case nope }
func risky() throws -> Int { throw E.nope }

let result = try? risky()        // nil
let safe   = (try? risky()) ?? 0 // 0

Combine-o com ?? para um valor padrão inline. Esta é a versão mais curta de "chame isso, me dê um valor de qualquer maneira".

try! diz "Eu sei que isso não vai lançar um erro". Se lançar, seu programa trava. Use-o apenas quando você puder provar que a chamada é segura; no código do dia a dia, prefira try? com um fallback ou o do/catch completo.

challenge icon

Desafio

Fácil

Defina NumError: Error com um caso bad. Defina uma função que lança erros parseEven(_ s: String) throws -> Int que:

  • Lança .bad quando s não puder ser analisado como Int, ou quando o valor analisado for ímpar
  • Caso contrário, retorna o inteiro analisado

Leia uma única linha de entrada: uma lista de strings separadas por vírgula. Para cada uma, use try? seguido por ?? -1 para obter o inteiro par analisado ou -1.

Imprima, em ordem, os inteiros resultantes unidos com ,. Em seguida, em uma segunda linha, imprima a contagem de valores que retornaram como -1.

Para a entrada 4,7,abc,8,11,2, a saída é:

4,-1,-1,8,-1,2
3

Experimente você mesmo

let parts = readLine()!.components(separatedBy: ",")

// TODO: enum NumError; func parseEven(_:) throws -> Int;
// para cada parte, (try? parseEven(part)) ?? -1
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica e Fluxo

Pratique por conta própria: Playground de Swift