Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

185
Vistas
El subíndice perezoso de Swift ignora el filtro

¿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]) // 3

Parece 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?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

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]) // 30

O, 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]) //H

En 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

over 4 years ago · Santiago Trujillo Denunciar

0

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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda