Menu
Coddy logo textTech

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 // 0

Combí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.

challenge icon

Desafío

Fácil

Define NumError: Error con un caso bad. Define una función parseEven(_ s: String) throws -> Int que:

  • Lance .bad cuando s no pueda ser analizado como Int, 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
3

Hoja 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 respaldo

try! 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
quiz iconPonte a prueba

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