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

challenge icon

Desafío

Fácil

Define NumError: Error con un case bad. Define parseEven(_ s: String) throws -> Int que lance errores y que:

  • Lance .bad cuando s no se pueda analizar 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 ,. 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
3

Pruébalo tú mismo

let parts = readLine()!.components(separatedBy: ",")

// TODO: enum NumError; func parseEven(_:) throws -> Int;
// para cada part, (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

Practica por tu cuenta: Playground de Swift