Comprende con claridad cómo y cuándo usar inicializadores fallables en Swift para evitar estados inválidos. Verás cómo se combinan optionals, init?, validaciones con switch, y el encadenamiento con super.init? en herencia. Todo con ejemplos directos y prácticos.
¿Qué es un inicializador fallable en Swift y cuándo usar optionals?
Un inicializador fallable se marca con init? y expresa que la creación de una instancia puede fallar y devolver nil. Es clave cuando no existe un valor válido para inicializar. Si la inicialización no es posible, el resultado debe ser nil.
Usa init? cuando no hay un valor por defecto razonable.
Un objeto creado con init? es un optional. Se debe manejar con if let, guard let o un force unwrapping consciente.
Si un inicializador puede devolver nil, esta posibilidad se propaga a quien lo usa.
Recuerda: los optionals requieren manejo seguro. Puedes usar if let, guard let o, si sabes que hay valor, un force unwrapping.
¿Cómo crear un enum con init? que valida un Character?
Cuando un valor externo no siempre es válido, init? evita estados imposibles. Ejemplo: un enumerado de unidades de temperatura que se inicializa desde un símbolo (Character). Si el símbolo no coincide, devuelve nil.
El resultado es un optional, así que se aplica la teoría de optionals para consumirlo.
¿Cómo se propagan los optionals con super.init? en herencia?
Si un inicializador puede fallar, y otro inicializador depende de él, la posibilidad de fallo se encadena. Observa un caso típico con un Product y un Cart item.
classProduct{let name:Stringinit?(name:String){if name.isEmpty {returnnil}// sin nombre, no hay productoself.name = name
}}classCartItem:Product{let quantity:Intinit?(name:String, quantity:Int){if quantity <1{returnnil}// cantidades inválidasself.quantity = quantity
super.init?(name: name)// puede fallar si name está vacío}}// Consumo seguro con optionalsiflet someSocks =CartItem(name:"socks", quantity:2){print(someSocks.name)// "socks"print(someSocks.quantity)// 2}