Las Lazy Collections (colecciones perezosas) son un mecanismo especial que apareció en Swift 2, que permite posponer los cálculos sobre colecciones hasta el momento en que se accede directamente al resultado. Originalmente, los métodos estándar de colecciones (como map, filter) devolvían un resultado completamente calculado de una nueva colección, lo que a veces conducía a un gasto innecesario de memoria y tiempo, especialmente al trabajar con matrices grandes o cadenas de transformaciones.
Problema radica en la creación excesiva de colecciones intermedias. Cada llamada a map o filter crea una nueva copia de los datos, lo que reduce notablemente el rendimiento del programa en caso de múltiples transformaciones.
Solución: utilizar colecciones perezosas mediante la propiedad .lazy. Swift combina todas las operaciones en una sola cadena y calcula solo aquellos elementos a los que realmente se accede.
Ejemplo de código:
let array = Array(1...1_000_000) let result = array.lazy.filter { $0 % 2 == 0 }.map { $0 * 3 } print(result.prefix(5)) // Solo se calcularán los 5 primeros valores
Características clave:
Pregunta 1: ¿Devuelve let b = a.lazy.map { ... } el resultado del cálculo de inmediato?
No, al usar .lazy y los métodos map/filter el resultado del cálculo se devuelve solo al acceder directamente a los datos (por ejemplo, a través de for-in, first, reduce).
Ejemplo de código:
let array = [1, 2, 3] let mapped = array.lazy.map { x in print("procesando\(x)") return x * 2 } // En este punto no se imprimirá nada let first = mapped.first // Aquí comenzarán a ejecutarse los cálculos y aparecerá la salida
Pregunta 2: ¿Se puede agregar un nuevo elemento a la colección original después de .lazy y también será procesado si se accede al resultado más tarde?
No, la Colección Perezosa refleja el estado de la colección en el momento de crear la representación perezosa. Los elementos agregados posteriormente no se tendrán en cuenta.
Pregunta 3: ¿Es el uso de .lazy eficaz para colecciones pequeñas (<100 elementos)?
No, para colecciones pequeñas la ganancia de los cálculos perezosos es prácticamente imperceptible, y a veces el exceso adicional afecta negativamente al rendimiento.
En el proyecto se usó sin pensarlo .lazy para todos los map/filter incluso en colecciones pequeñas.
Pros:
Contras:
Se refactorizaron informes de una gran base de transacciones aplicando .lazy solo para funciones donde realmente había largas cadenas de transformaciones.
Pros:
Contras: