Comment concaténer ou fusionner des tableaux dans Swift?
Si il y a deux tableaux créés dans swift comme ceci:
var a:[CGFloat] = [1, 2, 3]
var b:[CGFloat] = [4, 5, 6]
Comment peuvent-ils être fusionné à [1, 2, 3, 4, 5, 6]
?
- C'est un sous-ensemble de stackoverflow.com/q/24465281/78336
Vous devez vous connecter pour publier un commentaire.
Vous pouvez concaténer les tableaux avec
+
, la construction d'un nouveau tableauou ajouter un tableau à l'autre avec
+=
(ouappend
):AnyObject
indique qu'un objet, qui, comme je comprends signifie que quelque chose est instancié à partir d'un type de classe.CGFloat
n'est pas un objet, c'est une valeur scalaire. Si je comprends bien, les tableaux peuvent contenir des scalaires, sauf si elle est définie comme contenantAnyObject
ou sont affinés. Je soupçonne cependant, ici, le problème est que le tableau est enveloppé dans une option, de sorte que vous avez à déballer avec!
ou?
premier.[Any]
?b
partie dea
est modifié (donc peut-être eliding une copie deb
pendanta.appendContentsOf(b)
)?array1 = [Obj1, Obj2, Obj3]
,let array2 = [Obj1, Obj3, Obj4, Obj5]
. Je veux que le résultat soit:combinedArray = [Obj1, Obj2, Obj3, Obj4, Obj5]
. Les pointeurs?Avec Swift 5, en fonction de vos besoins, vous pouvez choisir l'une des six façons suivantes pour concaténer/fusion de deux tableaux.
#1. Fusionner deux tableaux dans un nouveau tableau avec
Array
's+(_:_:)
générique opérateurArray
a un+(_:_:)
générique de l'opérateur.+(_:_:)
a la suite de déclaration:Le suivant aire de Jeux exemple de code montre comment fusionner deux tableaux de type
[Int]
dans un nouveau tableau à l'aide de+(_:_:)
générique de l'opérateur:#2. Ajouter les éléments d'un tableau dans un tableau existant avec
Array
's+=(_:_:)
générique opérateurArray
a un+=(_:_:)
générique de l'opérateur.+=(_:_:)
a la suite de déclaration:Le suivant aire de Jeux exemple de code montre comment ajouter les éléments d'un tableau de type
[Int]
dans un tableau à l'aide de+=(_:_:)
générique de l'opérateur:#3. Ajouter un tableau à un autre tableau avec
Array
'sappend(contentsOf:)
méthodeSwift
Array
a unappend(contentsOf:)
méthode.append(contentsOf:)
a la suite de déclaration:Le suivant aire de Jeux exemple de code montre comment ajouter un tableau à un autre tableau de type
[Int]
à l'aide deappend(contentsOf:)
méthode:#4. Fusionner deux tableaux dans un nouveau tableau avec
Sequence
'sflatMap(_:)
méthodeSwift fournit un
flatMap(_:)
méthode pour tous les types conformes àSequence
protocole (y comprisArray
).flatMap(_:)
a la suite de déclaration:Le suivant aire de Jeux exemple de code montre comment fusionner deux tableaux de type
[Int]
dans un nouveau tableau à l'aide deflatMap(_:)
méthode:#5. Fusionner deux tableaux dans un nouveau tableau avec
Sequence
'sjoined()
méthode etArray
'sinit(_:)
initialiseurSwift fournit un
joined()
méthode pour tous les types conformes àSequence
protocole (y comprisArray
).joined()
a la suite de déclaration:En outre, Swift
Array
a uninit(_:)
initialiseur.init(_:)
a la suite de déclaration:Par conséquent, le suivant aire de Jeux exemple de code montre comment fusionner deux tableaux de type
[Int]
dans un nouveau tableau à l'aide dejoined()
méthode etinit(_:)
initialiseur:#6. Fusionner deux tableaux dans un nouveau tableau avec
Array
'sreduce(_:_:)
méthodeSwift
Array
a unreduce(_:_:)
méthode.reduce(_:_:)
a la suite de déclaration:Le suivant aire de Jeux de code montre comment fusionner deux tableaux de type
[Int]
dans un nouveau tableau à l'aide dereduce(_:_:)
méthode:+
pour 2 tableaux etjoined()
pour un tableau de tableaux.Si vous n'êtes pas un grand fan de la surcharge d'opérateur, ou tout simplement plus d'un type fonctionnel:
Ma méthode préférée depuis Swift 2.0 est aplatir
Ce sera le retour de
FlattenBidirectionalCollection
donc, si vous voulez juste unCollectionType
ce sera suffisant et que vous aurez l'évaluation différée pour gratuit. Si vous avez besoin exactement le Tableau, vous pouvez le faire:flatten()
il ne semble pas exister plus de nos jours. Mais vous pouvez envisager d'joined()
.Pour compléter la liste des solutions de rechange possibles,
reduce
pourrait être utilisé pour mettre en œuvre le comportement de aplatir:La meilleure alternative (performance/mémoire-sage) parmi ceux présentés est tout simplement
flatten
, qui vient envelopper l'origine des tableaux paresseusement, sans création d'une nouvelle structure de tableau.Mais remarquez que aplatir ne retourne pas un
LazyCollection
, de sorte que les paresseux comportement ne sera pas propagée à la prochaine opération le long de la chaîne (carte, flatMap, filtre, etc...).Si la paresse de sens que dans votre cas particulier, n'oubliez pas de faire précéder ou ajouter un
.lazy
àflatten()
, par exemple, la modification de Tomasz exemple de cette façon:Si vous voulez le deuxième tableau, pour être inséré, après un index particulier, vous pouvez le faire (comme de Swift 2.2):
Swift 3.0
Vous pouvez créer un nouveau tableau par l'addition de deux matrices de types compatibles avec l'opérateur d'addition (
+
). Le nouveau tableau est de type inféré à partir de la catégorie de deux matrice de vous ajouter ensemble,c'est le droit des résultats de codes ci-dessus.
Swift 4.X
facile je sais, c'est juste utiliser le signe +
Voici le chemin le plus court pour fusionner deux tableaux.
Concaténer/fusionner
si vous voulez résultat : [1,2,3,[4,5,6]]
code ci-dessus convertir arrayOne comme un seul élément et l'ajouter à la fin de arrayTwo.
si vous voulez comme résultat : [1, 2, 3, 4, 5, 6] ensuite,
code ci-dessus va ajouter tous les éléments de arrayOne à la fin de arrayTwo.
Grâce.
Marge tableau des types de données différents :
De sortie :
De la même façon, avec les dictionnaires pour les tableaux, on peut:
et vous pouvez parcourir dict1 et ajouter dict2 si la "clé" correspond à