¿Cómo funciona la subíndice de un filtro perezoso?
let ary = [0,1,2,3] let empty = ary.lazy.filter { $0 > 4 }.map { $0 + 1 } print(Array(empty)) // [] print(empty[2]) // 3Parece que simplemente ignora el filtro y hace el mapa de todos modos. ¿Está esto documentado en alguna parte? ¿Qué otras colecciones perezosas tienen un comportamiento excepcional como este?
Todo se reduce a subíndices de LazyFilterCollection con un número entero que, en este caso, ignora el predicado y reenvía la operación de subíndices a la base.
Por ejemplo, si buscamos los enteros estrictamente positivos en una matriz:
let array = [-10, 10, 20, 30] let lazyFilter = array.lazy.filter { $0 > 0 } print(lazyFilter[3]) // 30O, si estamos buscando los caracteres en minúsculas en una cadena:
let str = "Hello" let lazyFilter = str.lazy.filter { $0 > "Z" } print(lazyFilter[str.startIndex]) //HEn ambos casos, el subíndice se reenvía a la colección base.
La forma correcta de subíndices de LazyFilterCollection es usar un LazyFilterCollection<Base>.Index como se describe en la documentación :
let start = lazyFilter.startIndex let index = lazyFilter.index(start, offsetBy: 1) print(lazyFilter[index]) Lo que da como resultado 20 para el ejemplo de matriz, o l para el ejemplo de cadena.
En su caso, tratando de acceder al índice 3 :
let start = empty.startIndex let index = empty.index(start, offsetBy: 3) print(empty)generaría el error de tiempo de ejecución esperado:
Error fatal: Índice fuera de rango
Para agregar a la respuesta de Carpsen90, se encuentra con una de las particularidades de Collection : no se recomienda ni es seguro acceder a las colecciones mediante un índice absoluto, incluso si el sistema de tipos lo permite. Porque la colección que recibe puede ser un subconjunto de otra.
Tomemos un ejemplo más simple, el corte de matrices:
let array = [0, 1, 2, 3, 4] let slice = array[2..<3] print(slice) // [2] print(slice.first) // Optional(2) print(slice[0]) // crashes with array index out of bounds Incluso si slice es una colección indexable por un número entero, no es seguro usar números enteros absolutos para acceder a elementos de esa colección, ya que la colección puede tener un conjunto diferente de índices.