Optional es un tipo especial en Swift que puede contener un valor del tipo T o no contener ningún valor en absoluto (nil). Se escribe como T?. Permite indicar explícitamente que una variable puede no tener valor y garantiza la verificación de la existencia del valor en el momento de la compilación.
Mecanismos de extracción de valor:
let str: String? = "hello" if let s = str { print(s) }
guard let s = str else { return } print(s)
let s = str!
(PUEDE causar un crash en tiempo de ejecución si el valor es nil)
let length = str?.count
??):let value = str ?? "default"
¿Se puede asignar nil a una variable del tipo String, en lugar de String?, y qué ocurrirá?
Respuesta:
No, a una variable de tipo normal (String) no se le puede asignar el valor nil. Solo un optional puede ser nil, de lo contrario ocurrirá un error de compilación.
Ejemplo:
var a: String // a = nil // error de compilación: Nil cannot be assigned to type 'String' var b: String? b = nil // OK
Historia
En la aplicación, al hacer force unwrapping de un valor, asumiendo que siempre se recibiría una respuesta correcta de la base de datos, ocurría un crash al faltar un campo. El error se resolvió con una verificación adicional mediante optional binding.
Historia
Al enviar notificaciones push, el nombre de usuario se almacenaba en una variable no optional, lo que provocaba caídas de la aplicación si el nombre estaba vacío desde la API. Después de un análisis, se cambió el tipo a optional y se agregó el manejo de nil.
Historia
En un proyecto, al pasar un valor optional a una función, el argumento fue declarado sin el tipo optional. Surgieron errores ocultos y caídas. Se realizaron cambios: el tipo del parámetro se convirtió en optional y se agregaron verificaciones de existencia de valor.