ProgramaciónDesarrollador iOS

¿Cuáles son las principales diferencias de las propiedades lazy en Swift? ¿Cuándo se debe usar lazy, qué características y trampas existen al inicializarlas, y cómo evitar problemas típicos?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

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:

  • Las propiedades lazy solo son permitidas para variables (var), no para constantes (let).
  • Dentro de estructuras, las propiedades lazy no funcionan si la propia estructura es inmutable.
  • Si se establece a través de otro hilo, no es seguro para hilos. Se debe evitar el acceso simultáneo a las propiedades lazy desde diferentes hilos.
  • Al copiar objetos de clase, el valor lazy se almacena en caché para cada instancia por separado.

Pregunta capciosa.

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"

Ejemplos de errores reales debido al desconocimiento de los matices del tema.


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.