En Swift, ¿hay una manera inteligente de usar los métodos de orden superior en Array para devolver los 5 primeros objetos? La forma obj-c de hacerlo fue guardar un índice y for-loop a través del índice incremental de la matriz hasta que fue 5 y devolvió la nueva matriz. ¿Hay una manera de hacer esto con filter, mapo reduce?
179

nelementos de unArray.Respuestas:
Con mucho, la forma más perfecta de obtener los primeros N elementos de una matriz Swift es usar
prefix(_ maxLength: Int):Esto tiene el beneficio de estar a salvo. Si el recuento al que pasa
prefixes mayor que el recuento de la matriz, entonces solo devuelve toda la matriz.NOTA: como se señaló en los comentarios, en
Array.prefixrealidad devuelve unArraySlice, no unArray. En la mayoría de los casos, esto no debería marcar la diferencia, pero si necesita asignar el resultado a unArraytipo o pasarlo a un método que espera unArrayparámetro, deberá forzar el resultado a unArraytipo:let first5 = Array(someArray.prefix(5))fuente
dropFirstydropLast, también podría tenertakeFirstytakeLast.first5ser una matriz, simplemente escribalet first5 = Array(someArray.prefix(5))video = video.prefix(5)en Xcode 7.2 se produce un error de compilaciónCannot assign value of type 'ArraySlice<Video>' to type '[Video]'video = Array(video.prefix(5))prefixes posiblemente solo Swift 2.x (no recuerdo si estaba en 1.x), pero ciertamente existe en cualquier sistema operativo que soporte Swift 2.x, que es iOS 7 y superior. La disponibilidad de la función Swift está determinada por las versiones de Swift, no por las versiones de iOS.Actualización: ahora existe la posibilidad de usar
prefixpara obtener los primeros n elementos de una matriz. Verifique la respuesta de @ mluisbrown para obtener una explicación sobre cómo usar el prefijo.Respuesta original: puede hacerlo realmente fácil sin
filter,maporeducesimplemente devolviendo un rango de su matriz:fuente
nelementos de una matriz Swift, puede hacerlo, lowholeArray.prefix(n)que tiene el beneficio adicional de ser seguro. Sines mayor que el tamaño de la matriz,prefixdevuelve toda la matriz.wholeArrayno tiene más elementos quenprefix.Con Swift 5, de acuerdo con sus necesidades, puede elegir uno de los 6 siguientes códigos de Playground para resolver su problema.
# 1 Usando
subscript(_:)subíndice# 2 Utilizando
prefix(_:)métodoComplejidad: O (1) si la colección se ajusta a
RandomAccessCollection; de lo contrario, O ( k ), donde k es el número de elementos para seleccionar desde el comienzo de la colección.Apple declara para
prefix(_:):# 3 Utilizando
prefix(upTo:)métodoComplejidad: O (1)
Apple declara para
prefix(upTo:):# 4. Utilizando el
prefix(through:)método# 5. Utilizando el
removeSubrange(_:)métodoComplejidad: O ( n ), donde n es la longitud de la colección.
# 6. Utilizando el
dropLast(_:)métodoComplejidad: O (1) si la colección se ajusta a
RandomAccessCollection; de lo contrario, O ( k ), donde k es el número de elementos a soltar.fuente
fuente
SWIFT 4
Una solución diferente:
Una solución en línea fácil que no se bloqueará si su matriz es demasiado corta
Pero funciona bien con esto.
Por lo general, esto se bloquearía si hicieras esto:
fuente
[0,1,2,3,4,5].enumerated().flatMap{ $0.offset < 1000 ? $0.element : nil }Para obtener los primeros 5 elementos de una matriz, todo lo que necesita hacer es cortar la matriz en cuestión. En Swift, lo haces así:
array[0..<5].Para que elegir los N primeros elementos de una matriz sea un poco más funcional y generalizable, puede crear un método de extensión para hacerlo. Por ejemplo:
fuente
Cambié ligeramente la respuesta de Markus para actualizarla para la última versión de Swift, como
varla declaración dentro de su método ya no es compatible:fuente
Swift 4
Para obtener los primeros N elementos de una matriz Swift puede usar
prefix(_ maxLength: Int):fuente
Swift 4 con guardar tipos de matriz
fuente
Actualización para swift 4:
Para Swift 3:
fuente
Llano y simple
fuente
Para una matriz de objetos, puede crear una extensión desde Secuencia.
Uso:
fuente