Las propiedades lazy en Swift se calculan solo en el primer acceso a ellas. Esto se usa a menudo para objetos que consumen muchos recursos (por ejemplo, cálculos pesados, descargas de red) que no se necesitan de inmediato. Se declaran utilizando la palabra clave lazy:
class DataFetcher { lazy var data: Data = self.loadData() func loadData() -> Data { /* … */ } }
Características y matices:
lazy solo son permitidas para variables (var), no para constantes (let).lazy no funcionan si la propia estructura es inmutable.lazy se almacena en caché para cada instancia por separado.Pregunta: "¿Se crea el valor para la propiedad lazy al inicializar la instancia de la clase?"
Respuesta: No, el valor se calcula solo en el primer acceso a la propiedad, no al inicializar.
class Expensive { init() { print("init") } } class Example { lazy var heavy = Expensive() } let foo = Example() // no se imprime nada _ = foo.heavy // ahora "init"
Historia
En un proyecto para dos plataformas, se utilizó un array lazy (lazy var) para almacenar la caché de imágenes. Al acceder simultáneamente desde varios hilos, ocurrieron condiciones de carrera, envolvieron lazy var en mutexes, pero olvidaron el lazy, lo que llevó a un fallo de la aplicación.
Historia
Un joven desarrollador intentó declarar lazy let para almacenar un cálculo pesado. El código no se compilaba, ya que lazy solo está permitido para var: tuvieron que reconsiderar la arquitectura.
Historia
Un desarrollador declaró una propiedad lazy capturando self dentro de un closure durante la inicialización. Esto llevó a una referencia cíclica: el objeto no se de-inicializaba incluso después de salir de todas las pantallas.