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 // 0Combine-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.
Desafio
FácilDefina NumError: Error com um caso bad. Defina uma função que lança erros parseEven(_ s: String) throws -> Int que:
- Lança
.badquandosnão puder ser analisado comoInt, 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
3Folha de consulta
try? converte um erro lançado em nil, retornando um Optional:
let result = try? risky() // nil ao lançar erro
let safe = (try? risky()) ?? 0 // valor de fallbacktry! causa um crash se a chamada lançar um erro — use apenas quando a chamada for garantidamente segura:
let value = try! guaranteedSafe()Experimente você mesmo
let parts = readLine()!.components(separatedBy: ",")
// TODO: enum NumError; func parseEven(_:) throws -> Int;
// para cada parte, (try? parseEven(part)) ?? -1
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
1Strings a Fundo
Contagem e ÍndicesCase e TrimBusca em StringsDivisão e JunçãoSubstituindo SubstringsRecapitulação - Verificação de Nome de Usuário4Conjuntos
Criando ConjuntosUnião e InterseçãoSubtração e Diferença SimétricaSubconjunto e SuperconjuntoRecapitulação - Filtro de Tags7Projeto - Monitor de Hábitos
Visão Geral do ProjetoMarcar como Concluído10Projeto - Mecanismo de Quiz
Visão Geral do ProjetoFazer Perguntas2Intervalos e Strides
Fechado vs Meio-AbertoStrideMétodos de IntervaloIntervalos no SwitchRecapitulação - Grade de Calendário5Funções de Ordem Superior Parte 1
MapFilterReduceEncadeando map, filter, reduceRecapitulação - Estatísticas de Palavras3Dicionários
Declarando DicionáriosBusca OpcionalAtualizando DicionáriosIterando DicionáriosAgrupando ValoresRecapitulação - Inventário6Funções de Ordem Superior Parte 2
compactMapflatMapsorted(by:)Construindo PipelinesRecapitulação - Leaderboard9Tratamento de Erros
throws e Errordo, try, catchtry? e try!Propagando ErrosRecapitulação - Calculadora Segura