try? y try!
Parte de la sección Lógica y Flujo del Journey de Swift de Coddy — lección 46 de 56.
A veces no te importa qué error lanzó una función, solo quieres un resultado o una alternativa. Swift te ofrece dos formas abreviadas.
try? convierte cualquier error lanzado en nil. El resultado es un Optional del tipo de retorno de la función:
enum E: Error { case nope }
func risky() throws -> Int { throw E.nope }
let result = try? risky() // nil
let safe = (try? risky()) ?? 0 // 0Combínalo con ?? para un valor predeterminado en línea. Esta es la versión más corta de "llama a esto, dame un valor de cualquier manera".
try! dice «Sé que esto no lanzará un error». Si lo hace, tu programa fallará. Úsalo solo cuando puedas demostrar que la llamada es segura; en el código cotidiano, prefiere try? con una alternativa o el bloque do/catch completo.
Desafío
FácilDefine NumError: Error con un caso bad. Define una función parseEven(_ s: String) throws -> Int que:
- Lance
.badcuandosno pueda ser analizado comoInt, o cuando el valor analizado sea impar - De lo contrario, devuelva el entero analizado
Lee una sola línea de entrada: una lista de cadenas separadas por comas. Para cada una, usa try? seguido de ?? -1 para obtener el entero par analizado o -1.
Imprime, en orden, los enteros resultantes unidos con ,. Luego, en una segunda línea, imprime la cantidad de valores que resultaron ser -1.
Para la entrada 4,7,abc,8,11,2, la salida es:
4,-1,-1,8,-1,2
3Hoja de referencia
try? convierte un error lanzado en nil, devolviendo un Optional:
let result = try? risky() // nil si se lanza un error
let safe = (try? risky()) ?? 0 // valor de respaldotry! provoca un fallo si la llamada lanza un error — úsalo solo cuando se garantice que la llamada es segura:
let value = try! guaranteedSafe()Pruébalo tú mismo
let parts = readLine()!.components(separatedBy: ",")
// TODO: enum NumError; func parseEven(_:) throws -> Int;
// para cada parte, (try? parseEven(part)) ?? -1
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
1Strings a fondo
Conteo e índicesMayúsculas, minúsculas y TrimBúsqueda en StringsDividir y unirReemplazo de subcadenasResumen: Validación de usuario4Conjuntos
Crear conjuntosUnión e intersecciónResta y diferencia simétricaSubconjunto y superconjuntoResumen - Filtro de etiquetas7Proyecto - Seguimiento de hábitos
Descripción general del proyectoMarcar como completado10Proyecto - Motor de cuestionarios
Descripción general del proyectoHacer preguntas2Rangos e Intervalos
Cerrados vs. SemiabiertosSaltos (Stride)Métodos de RangosRangos en SwitchResumen - Cuadrícula de calendario5Funciones de orden superior Pt. 1
MapFilterReduceEncadenar map, filter, reduceResumen - Estadísticas de palabras3Diccionarios
Declaración de diccionariosBúsqueda opcionalActualización de diccionariosIteración de diccionariosAgrupación de valoresResumen - Inventario6Funciones de orden superior - Parte 2
compactMapflatMapsorted(by:)Construcción de pipelinesRepaso - Tabla de posiciones9Manejo de errores
throws y Errordo, try, catchtry? y try!Propagación de erroresRepaso - Calculadora segura