Operador de coalescencia nula y protocolo Custom String Convertible

Seguramente te has encontrado con una API en la que hayas tenido que utilizar propiedades opcionales en los structs, o bien has tenido que crear uno y después debes desempaquetar cada propiedad para mostrarla en una View de SwiftUI. Incluso cuando estás depurando el código e imprimes ese tipo de dato y te muestra toda la información de cada uno de ellos, pero con dos o tres propiedades te bastaría.

Operador de coalescencia nula: ??

Proporciona una manera de desempaquetar valores, permitiendo especificar un valor por defecto, si el valor de la izquierda es nil tomará el de la derecha. Esto nos llevaría a que en una View en SwiftUI el código se vea así:

//...
let farmacia: APIFarmacia
    var body: some View {
        Text(farmacia.title)
        Text(farmacia.calle ?? "No disponible")
        Text(farmacia.horario ?? "No disponible")
		    Text(farmacia.sector ?? "No disponible")
//...

Si creamos una extensión del Farmacia con nuevas variables ya desempaquetadas, nos permitirá una mayor legibilidad del código.

Nótese que si la primera propiedad NO es nil devolverá esa propiedad, en caso de que sea nil devolverá la segunda, que NO debe ser opcional.

(Incluso podrías poner varias propiedades opcionales, pero la última no lo podrá ser).

extension APIFarmacia {
// llámalos como quieras
   var horarioText: String {
        horario ?? .noDisponible
    }
    
    var calleText: String {
        calle ?? .noDisponible
    }
    
    var sectorText: String {
      sector ?? .noDisponible
    }
}

(Incluso podrías poner varias propiedades opcionales, pero la última no lo podrá ser).

// Ejemplo
var calleText: String {
  direccion ?? calle ?? .noDisponible
}

He hecho una extensión de String con una propiedad estática con el texto «No disponible»

extension String {
    static let noDisponible = "No disponible"
}

y ahora tienes en tu vista de SwiftUI mucho más limpia

//...
let farmacia: APIFarmacia
    var body: some View {
        Text(farmacia.title)
        Text(farmacia.calleText)
        Text(farmacia.horarioText)
		    Text(farmacia.sectorText)
    }
//...

Custom String Convertible

Es un protocolo que es una representación personalizada de tipo String del tipo de dato.

Cuando haces una depuración e imprimes en consola el dato, lo que hará Swift será mostrar toda la información del struct tal y como está

Farmacia(id: 1, title: "Farmacia Mayor", telefonos: Optional("666 36 36 29"), horario: Optional("9:15-13:45h y 17:00-20:00h. Sábados 9:15- 13:45h. Domingos y festivos cerrados."))

Si conformas tu struct con el protocolo CustomStringConvertible te obligará a añadir la propiedad description. Una propiedad que puede ser calculada y en la que indicas que información quieres que muestre:

Para este caso:

extension APIFarmacia: CustomStringConvertible {
   var description: String {
        "\(title) - \(horarioView) - \(calleText)"
    }   
}

Conformado con este protocolo ahora Swift te devolverá la información que hayas indicado que te permita identificar ese elemento.

Farmacia Mayor - 9:15-13:45h y 17:00-20:00h. Sábados 9:15- 13:45h. Domingos y festivos cerrados. - Calle Mayor, 30

¿Quieres recibir posts, cheatCodes, enlaces y katas en Swift para practicar?

Quincenalmente recibirás en tu correo electrónico la newsletter, solo hace falta tu correo electrónico.