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 un valor alternativo. 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 generará una excepción». Si la genera, tu programa se bloquea. Úsalo solo cuando puedas demostrar que la llamada es segura; en el código cotidiano, prefiere try? con una alternativa o el do/catch completo.
Desafío
FácilDefine NumError: Error con un case bad. Define parseEven(_ s: String) throws -> Int que lance errores y que:
- Lance
.badcuandosno se pueda analizar 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 ,. Después, en una segunda línea, imprime la cantidad de valores que devolvieron -1.
Para la entrada 4,7,abc,8,11,2, la salida es:
4,-1,-1,8,-1,2
3Pruébalo tú mismo
let parts = readLine()!.components(separatedBy: ",")
// TODO: enum NumError; func parseEven(_:) throws -> Int;
// para cada part, (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 seguraPractica por tu cuenta: Playground de Swift