Dans Swift, existe-t-il une manière intelligente d'utiliser les méthodes d'ordre supérieur sur Array pour renvoyer les 5 premiers objets? La manière obj-c de le faire était de sauvegarder un index et de faire une boucle for à travers le tableau en incrémentant l'index jusqu'à ce qu'il soit 5 et en renvoyant le nouveau tableau. Y a-t-il un moyen de faire cela avec filter
, map
ou reduce
?
179
n
éléments d'un fichierArray
.Réponses:
De loin, le moyen le plus simple d'obtenir les N premiers éléments d'un tableau Swift est d'utiliser
prefix(_ maxLength: Int)
:Cela a l'avantage d'être sûrs. Si le nombre que vous passez
prefix
est supérieur au nombre de tableaux, il renvoie simplement le tableau entier.REMARQUE: comme indiqué dans les commentaires,
Array.prefix
renvoie en fait unArraySlice
, pas unArray
. Dans la plupart des cas, cela ne devrait pas faire de différence, mais si vous devez attribuer le résultat à unArray
type ou le transmettre à une méthode qui attend unArray
paramètre, vous devrez forcer le résultat dans unArray
type:let first5 = Array(someArray.prefix(5))
la source
dropFirst
etdropLast
, pourrait aussi bien avoirtakeFirst
ettakeLast
.first5
d'être un tableau, écrivez simplementlet first5 = Array(someArray.prefix(5))
video = video.prefix(5)
dans Xcode 7.2 entraîne une erreur de compilationCannot assign value of type 'ArraySlice<Video>' to type '[Video]'
video = Array(video.prefix(5))
prefix
est peut-être seulement Swift 2.x (je ne me souviens pas si c'était en 1.x), mais il existe certainement dans tout système d'exploitation prenant en charge Swift 2.x, qui est iOS 7 et supérieur. La disponibilité des fonctionnalités Swift est déterminée par les versions Swift, et non par les versions iOS.Mise à jour: Il y a maintenant la possibilité d'utiliser
prefix
pour obtenir les n premiers éléments d'un tableau. Consultez la réponse de @ mluisbrown pour savoir comment utiliser le préfixe.Réponse d' origine: Vous pouvez le faire vraiment facile sans
filter
,map
oureduce
simplement en retournant une gamme de votre tableau:la source
n
éléments d'un tableau Swift, vous pouvez le faire,wholeArray.prefix(n)
ce qui présente l'avantage supplémentaire d'être en sécurité. Sin
est plus grand que la taille du tableauprefix
renvoie le tableau entier.wholeArray
n'a pas plus d'éléments quen
prefix
.Avec Swift 5, selon vos besoins, vous pouvez choisir l'un des 6 codes Playground suivants afin de résoudre votre problème.
#1. Utilisation de l'
subscript(_:)
indice# 2. Utilisation de la
prefix(_:)
méthodeComplexité: O (1) si la collection est conforme à
RandomAccessCollection
; sinon, O ( k ), où k est le nombre d'éléments à sélectionner au début de la collection.Apple déclare pour
prefix(_:)
:# 3. Utilisation de la
prefix(upTo:)
méthodeComplexité: O (1)
Apple déclare pour
prefix(upTo:)
:# 4. Utilisation de la
prefix(through:)
méthode# 5. Utilisation de la
removeSubrange(_:)
méthodeComplexité: O ( n ), où n est la longueur de la collection.
# 6. Utilisation de la
dropLast(_:)
méthodeComplexité: O (1) si la collection est conforme à
RandomAccessCollection
; sinon, O ( k ), où k est le nombre d'éléments à supprimer.la source
la source
SWIFT 4
Une solution différente:
Une solution en ligne simple qui ne plantera pas si votre baie est trop courte
Mais fonctionne bien avec cela.
Habituellement, cela planterait si vous faisiez ceci:
la source
[0,1,2,3,4,5].enumerated().flatMap{ $0.offset < 1000 ? $0.element : nil }
Pour obtenir les 5 premiers éléments d'un tableau, tout ce que vous avez à faire est de découper le tableau en question. Dans Swift, vous le faites comme ceci:
array[0..<5]
.Pour rendre le choix des N premiers éléments d'un tableau un peu plus fonctionnel et généralisable, vous pouvez créer une méthode d'extension pour le faire. Par exemple:
la source
J'ai légèrement modifié la réponse de Markus pour la mettre à jour pour la dernière version de Swift, car à l'
var
intérieur de votre déclaration de méthode n'est plus prise en charge:la source
Swift 4
Pour obtenir les N premiers éléments d'un tableau Swift, vous pouvez utiliser
prefix(_ maxLength: Int)
:la source
Swift 4 avec sauvegarde des types de tableaux
la source
Mise à jour pour Swift 4:
Pour Swift 3:
la source
Plain & Simple
la source
Pour un tableau d'objets, vous pouvez créer une extension à partir de Sequence.
Usage:
la source