Computed properties de solo lectura en Swift

Clase 8 de 27Curso de Programación Orientada a Objetos en Swift

Resumen

Domina cómo y cuándo usar propiedades computadas de solo lectura en Swift. Verás por qué un valor derivado no debe modificarse directamente, cómo declarar el getter implícito y un ejemplo práctico: el volumen de un cuboide. Además, se aclara su uso tanto en structs como en classes y se propone un ejercicio aplicado.

¿Qué es una computed property de solo lectura en Swift?

Una variable es de solo lectura cuando no tiene setter y solo tiene getter. Es decir, su valor se calcula a partir de otros datos y no se puede asignar desde fuera. Esto evita inconsistencias: si alguien cambiara el volumen, no habría forma clara de saber cómo ajustar anchura, altura o profundidad.

  • Valor derivado: se calcula con otros campos internos.
  • Sin setter: no admite asignaciones externas.
  • Coherencia de datos: impide cambios ambiguos.

¿Cómo se declara un getter implícito en Swift?

Swift permite omitir la palabra clave get en una computed property de solo lectura. El cuerpo entre llaves define la expresión calculada.

  • Sintaxis concisa: var propiedad: Tipo { expresión }.
  • Claro y seguro: comunica que no hay setter.

¿Qué pasa si intentas modificar una read-only property?

Si intentas asignar un nuevo valor, Swift marca error: no se puede asignar una propiedad de solo lectura. El valor solo se consulta, no se modifica.

¿Cómo calcular el volumen de un cuboide con una computed property?

Se define un cuboide con anchura, altura y profundidad. El volumen es el producto de esas tres magnitudes. Aquí, lo correcto es exponerlo como propiedad computada de solo lectura.

struct Cuboid {
    var width: Double = 0.0
    var height: Double = 0.0
    var depth: Double = 0.0

    // Computed property de solo lectura
    var volume: Double {
        width * height * depth
    }
}

let cuboid = Cuboid(width: 4, height: 5, depth: 2)
let v = cuboid.volume  // 40

// cuboid.volume = 57  // Error: propiedad de solo lectura.
  • width, height, depth: propiedades almacenadas que se pueden editar.
  • volume: propiedad computada sin setter, solo obtiene el valor.
  • Intento de asignación: produce error por ser de solo lectura.

¿Por qué el volumen no aparece como editable?

Al inspeccionar la instancia ves las propiedades almacenadas (anchura, altura, profundidad). El volumen solo se expone para consulta, no como campo asignable. Esto refuerza la idea de valor derivado.

¿Se usan en structs y en classes en Swift?

Sí. Aunque el ejemplo se mostró con struct, las propiedades computadas, las propiedades almacenadas y las propiedades perezosas también aplican a las classes. No te limites mentalmente a las estructuras: el patrón sirve en ambos tipos.

  • Reutilizable: mismo patrón en structs y classes.
  • Encapsulación: calcula internamente valores derivados.
  • API clara: evita exponer asignaciones incoherentes.

¿Cómo practicar con un saludo dinámico?

Se sugiere crear una estructura con género, idioma y nombre. La computed property construye el saludo según esos datos, por ejemplo, diciendo "Hola", "Hello" o "Bonjour" y añadiendo el nombre.

struct Saludo {
    var genero: String    // "femenino" o "masculino"
    var idioma: String    // "es", "en", "fr"
    var nombre: String

    var saludo: String {
        let base: String
        switch idioma {
        case "es": base = "Hola"
        case "en": base = "Hello"
        case "fr": base = "Bonjour"
        default: base = "Hola"
        }
        return "\(base), \(nombre)"
    }
}
  • Combina datos: idioma y nombre generan el mensaje.
  • Evita setter: el saludo se deriva del estado.
  • Extensible: puedes ajustar reglas por género cuando lo necesites.

¿Tienes otra idea de computed property útil en tu código? Comparte tu propuesta y cómo la implementarías.