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
3Experimente 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 SeguraPratique por conta própria: Playground de Swift