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
, map
o reduce
?
179
n
elementos 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
prefix
es mayor que el recuento de la matriz, entonces solo devuelve toda la matriz.NOTA: como se señaló en los comentarios, en
Array.prefix
realidad 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 unArray
tipo o pasarlo a un método que espera unArray
parámetro, deberá forzar el resultado a unArray
tipo:let first5 = Array(someArray.prefix(5))
fuente
dropFirst
ydropLast
, también podría tenertakeFirst
ytakeLast
.first5
ser 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))
prefix
es 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
prefix
para 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
,map
oreduce
simplemente devolviendo un rango de su matriz:fuente
n
elementos de una matriz Swift, puede hacerlo, lowholeArray.prefix(n)
que tiene el beneficio adicional de ser seguro. Sin
es mayor que el tamaño de la matriz,prefix
devuelve toda la matriz.wholeArray
no tiene más elementos quen
prefix
.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
var
la 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