Históricamente, en Objective-C, las propiedades se implementaban a través de métodos de acceso (getters y setters). En Swift se introdujo una construcción sintáctica especial para propiedades computadas, que permite crear fácilmente propiedades que calculan su valor "sobre la marcha". Esto amplía las posibilidades de encapsulación y expresividad del código de tipos.
Problema: No siempre es conveniente almacenar el resultado como una propiedad almacenada, especialmente si el valor depende de otras propiedades o cambia constantemente. El uso de métodos calculadores crea una interfaz de tipo menos legible, ocultando su naturaleza.
Solución: La propiedad computada se define con get y, si es necesario, set. Cada vez que se accede a dicha propiedad, se realiza un cálculo en lugar de leer de la memoria. Esto permite, por ejemplo, construir propiedades derivadas que están automáticamente sincronizadas con el resto del estado del objeto.
Ejemplo de código:
struct Rectangle { var width: Double var height: Double var area: Double { get { return width * height } set { // Actualización automática del width por el nuevo valor del campo area (ejemplo) width = sqrt(newValue / height) } } } var rect = Rectangle(width: 5, height: 2) print(rect.area) // 10 rect.area = 36 print(rect.width) // 3.0
Características clave:
¿Se puede usar willSet/didSet con propiedades computadas?
No, willSet y didSet solo se aplican a propiedades almacenadas. Para propiedades computadas, estos observadores no funcionan, ya que no hay almacenamiento automático del valor.
¿Puede una propiedad computada tener un tipo débil o implícitamente desenvuelto?
Sí, la propiedad computada puede ser opcional o implícitamente desenvuelta. Sin embargo, no tiene sentido hacer que tales propiedades sean weak, ya que no contienen una referencia, solo un cálculo.
¿En qué casos es mejor usar private set en propiedades computadas?
El modificador de acceso private(set) no se puede aplicar a la propiedad computada con get y set, solo a propiedades almacenadas. Para la propiedad computada, el set puede ser completamente privado usando private set, pero esto se realiza implícitamente a través de la disponibilidad del bloque set.
public var area: Double { private set { ... } get { ... } }
El getter de la propiedad computada realiza una carga de grandes datos desde la red cada vez que se accede, lo que provoca bloqueos y sobrecarga de la red.
Ventajas:
Desventajas:
La propiedad computada calcula el valor final basado en otras propiedades almacenadas con costos mínimos, el almacenamiento en caché de la lógica pesada se vende en un mecanismo separado.
Ventajas:
Desventajas: