[AnyObect]? n'est pas identique à CGFloat. Lors de la concaténation des tableaux AnyObject.
khunshan
6
Khunshan: AnyObjectindique un objet qui, si je comprends bien, signifie quelque chose qui est instancié à partir d'un type de classe. CGFloatn'est pas un objet, c'est une valeur scalaire. Si je comprends bien, les tableaux peuvent contenir des scalaires, sauf s'ils sont définis comme contenant AnyObjectou sont affinés. Cependant, je soupçonne ici que le problème est que le tableau est enveloppé dans une option, vous devez donc le déballer avec !ou d' ?abord.
Owen Godfrey
Savons-nous si l'intelligence Copy-On-Write de Swift 2 s'étend à déterminer si la bpartie de aest modifiée (donc peut-être en éluder une copie bpendant a.appendContentsOf(b))?
Ephemera
1
@OwenGodfrey merci. j'ai peu de confusion sur appendContentsOf et insertContentsOf.
L'exemple de code Playground suivant montre comment fusionner deux tableaux de type [Int]dans un nouveau tableau à l'aide+(_:_:) un opérateur générique:
let array1=[1,2,3]let array2=[4,5,6]let flattenArray = array1+ array2
print(flattenArray)// prints [1,2,3,4,5,6]
# 2. Ajoutez les éléments d'un tableau dans un tableau existant avecArray l' +=(_:_:)opérateur générique de
Arraya un +=(_:_:)opérateur générique.+=(_:_:)a la déclaration suivante :
Ajoute les éléments d'une séquence à une collection remplaçable par plage.
L'exemple de code Playground suivant montre comment ajouter les éléments d'un tableau de type [Int]dans un tableau existant à l'aide de+=(_:_:) un opérateur générique:
var array1=[1,2,3]let array2=[4,5,6]
array1+= array2
print(array1)// prints [1,2,3,4,5,6]
# 3. Ajouter un tableau à un autre tableau avec Arrayla append(contentsOf:)méthode de
Swift Arraya une append(contentsOf:)méthode. append(contentsOf:)a ce qui suit déclaration :
Ajoute les éléments d'une séquence ou d'une collection à la fin de cette collection.
mutatingfunc append<S>(contentsOf newElements: S)where S :Sequence,Self.Element== S.Element
L'exemple de code Playground suivant montre comment ajouter un tableau à un autre tableau de type à l' [Int]aide de la append(contentsOf:)méthode:
var array1=[1,2,3]let array2=[4,5,6]
array1.append(contentsOf: array2)
print(array1)// prints [1,2,3,4,5,6]
# 4. Fusionnez deux tableaux dans un nouveau tableau avecSequence la flatMap(_:)méthode de
Swift fournit une flatMap(_:)méthode pour tous les types conformes au Sequenceprotocole (y compris Array). flatMap(_:)a la déclaration suivante :
Renvoie un tableau contenant les résultats concaténés de l'appel de la transformation donnée avec chaque élément de cette séquence.
L'exemple de code Playground suivant montre comment fusionner deux tableaux de type [Int]dans un nouveau tableau à l'aide de la flatMap(_:)méthode:
let array1=[1,2,3]let array2=[4,5,6]let flattenArray =[array1, array2].flatMap({(element:[Int])->[Int]inreturn element
})
print(flattenArray)// prints [1,2,3,4,5,6]
# 5. Fusionner deux tableaux dans un nouveau tableau avec Sequence'sjoined() méthode et la méthode Arraydeinit(_:) initialiseur de
Swift fournit une joined()méthode pour tous les types conformes au Sequenceprotocole (y compris Array). joined()a la déclaration suivante:
Renvoie les éléments de cette séquence de séquences, concaténés.
func joined()->FlattenSequence<Self>
De plus, Swift Arraya un init(_:)initialiseur. init(_:)a la déclaration suivante :
Crée un tableau contenant les éléments d'une séquence.
init<S>(_ s: S)whereElement== S.Element, S :Sequence
Par conséquent, l'exemple de code Playground suivant montre comment fusionner deux tableaux de type [Int]dans un nouveau tableau à l'aide de la joined()méthode et de l' init(_:)initialiseur:
let array1=[1,2,3]let array2=[4,5,6]let flattenCollection =[array1, array2].joined()// type: FlattenBidirectionalCollection<[Array<Int>]>
let flattenArray =Array(flattenCollection)
print(flattenArray)// prints [1,2,3,4,5,6]
# 6. Fusionner deux tableaux dans un nouveau tableau avec Arrayla reduce(_:_:)méthode de
Swift Arraya une reduce(_:_:)méthode. reduce(_:_:)a ce qui suit déclaration :
Renvoie le résultat de la combinaison des éléments de la séquence à l'aide de la fermeture donnée.
Le code Playground suivant montre comment fusionner deux tableaux de type [Int]dans un nouveau tableau à l'aide de la reduce(_:_:)méthode:
let array1=[1,2,3]let array2=[4,5,6]let flattenArray =[array1, array2].reduce([],{(result:[Int], element:[Int])->[Int]inreturn result + element
})
print(flattenArray)// prints [1,2,3,4,5,6]
merci pour le partage de ce code, bonne explication, juste pour ajouter à votre réponse, ce serait mieux, si vous dites lequel est le plus efficace par la performance?
kokemomuke
J'aime +pour 2 tableaux et joined()pour un tableau de tableaux.
Cœur
Si vous fusionnez plus de 2 tableaux (ou chaînes ou quoi que ce soit d'autre), évitez d'utiliser l' +opérateur, cela génère des temps de compilation absolument insensés.
lawicko
@lawicko quelle méthode recommanderez-vous?
CyberMew
@CyberMew Tout ce qui n'utilise pas d'opérateurs surchargés, j'aime la méthode # 3 parce que je pense qu'elle est la plus lisible, mais j'aime aussi la méthode # 4 avec la carte plate. Pour les chaînes, j'aime la méthode # 5 car à la fin, vous obtenez immédiatement la chaîne jointe.
lawicko
34
Si vous n'êtes pas un grand fan de la surcharge des opérateurs, ou tout simplement plus d'un type fonctionnel:
// use flatMap
let result =[["merge","me"],["We","shall","unite"],["magic"]].flatMap { $0}// Output: ["merge", "me", "We", "shall", "unite", "magic"]
// ... or reduce
[[1],[2],[3]].reduce([],+)//Output:[1,2,3]
var a:[CGFloat]=[1,2,3]var b:[CGFloat]=[4,5,6]let c =[a, b].flatten()
Cela reviendra FlattenBidirectionalCollectiondonc si vous voulez juste un CollectionTypece sera suffisant et vous aurez une évaluation paresseuse gratuitement. Si vous avez exactement besoin du tableau, vous pouvez le faire:
flatten()ne semble plus exister de nos jours. Mais vous pouvez envisager joined().
Cœur
13
Pour compléter la liste des alternatives possibles, reducepourrait être utilisé pour implémenter le comportement d' aplatir :
var a =["a","b","c"]var b =["d","e","f"]let res =[a, b].reduce([],combine:+)
La meilleure alternative (performances / mémoire) parmi celles présentées est tout simplement flatten , qui enveloppe simplement les tableaux d'origine paresseusement sans créer de nouvelle structure de tableau.
Mais remarquez que Aplatir ne retourne pas unLazyCollection , de sorte que le comportement paresseux ne sera pas propagé à l'opération suivante le long de la chaîne (map, flatMap, filter, etc ...).
Si lazyness est logique dans votre cas particulier, rappelez - vous juste ou précédez ajouter un .lazyà flatten(), par exemple, modifier Tomasz exemple de cette façon:
Vous pouvez créer un nouveau tableau en ajoutant deux tableaux existants avec des types compatibles avec l'opérateur d'addition ( +). Le type du nouveau tableau est déduit du type des deux tableaux que vous ajoutez ensemble,
let arr0=Array(repeating:1, count:3)// [1, 1, 1]
let arr1=Array(repeating:2, count:6)//[2, 2, 2, 2, 2, 2]
let arr2= arr0+ arr1//[1,1,1,2,2,2,2,2,2]
Réponses:
Vous pouvez concaténer les tableaux avec
+
, en créant un nouveau tableauou ajoutez un tableau à l'autre avec
+=
(ouappend
):la source
AnyObject
indique un objet qui, si je comprends bien, signifie quelque chose qui 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 s'ils sont définis comme contenantAnyObject
ou sont affinés. Cependant, je soupçonne ici que le problème est que le tableau est enveloppé dans une option, vous devez donc le déballer avec!
ou d'?
abord.b
partie dea
est modifiée (donc peut-être en éluder une copieb
pendanta.appendContentsOf(b)
)?Avec Swift 5, selon vos besoins, vous pouvez choisir l'une des six façons suivantes pour concaténer / fusionner deux tableaux.
#1. Fusionner deux tableaux dans un nouveau tableau avec
Array
l'+(_:_:)
opérateur générique deArray
a un+(_:_:)
opérateur générique.+(_:_:)
a la déclaration suivante :L'exemple de code Playground suivant montre comment fusionner deux tableaux de type
[Int]
dans un nouveau tableau à l'aide+(_:_:)
un opérateur générique:# 2. Ajoutez les éléments d'un tableau dans un tableau existant avec
Array
l'+=(_:_:)
opérateur générique deArray
a un+=(_:_:)
opérateur générique.+=(_:_:)
a la déclaration suivante :L'exemple de code Playground suivant montre comment ajouter les éléments d'un tableau de type
[Int]
dans un tableau existant à l'aide de+=(_:_:)
un opérateur générique:# 3. Ajouter un tableau à un autre tableau avec
Array
laappend(contentsOf:)
méthode deSwift
Array
a uneappend(contentsOf:)
méthode.append(contentsOf:)
a ce qui suit déclaration :L'exemple de code Playground suivant montre comment ajouter un tableau à un autre tableau de type à l'
[Int]
aide de laappend(contentsOf:)
méthode:# 4. Fusionnez deux tableaux dans un nouveau tableau avec
Sequence
laflatMap(_:)
méthode deSwift fournit une
flatMap(_:)
méthode pour tous les types conformes auSequence
protocole (y comprisArray
).flatMap(_:)
a la déclaration suivante :L'exemple de code Playground suivant montre comment fusionner deux tableaux de type
[Int]
dans un nouveau tableau à l'aide de laflatMap(_:)
méthode:# 5. Fusionner deux tableaux dans un nouveau tableau avec
Sequence
'sjoined()
méthode et la méthodeArray
deinit(_:)
initialiseur deSwift fournit une
joined()
méthode pour tous les types conformes auSequence
protocole (y comprisArray
).joined()
a la déclaration suivante:De plus, Swift
Array
a uninit(_:)
initialiseur.init(_:)
a la déclaration suivante :Par conséquent, l'exemple de code Playground suivant montre comment fusionner deux tableaux de type
[Int]
dans un nouveau tableau à l'aide de lajoined()
méthode et de l'init(_:)
initialiseur:# 6. Fusionner deux tableaux dans un nouveau tableau avec
Array
lareduce(_:_:)
méthode deSwift
Array
a unereduce(_:_:)
méthode.reduce(_:_:)
a ce qui suit déclaration :Le code Playground suivant montre comment fusionner deux tableaux de type
[Int]
dans un nouveau tableau à l'aide de lareduce(_:_:)
méthode:la source
+
pour 2 tableaux etjoined()
pour un tableau de tableaux.+
opérateur, cela génère des temps de compilation absolument insensés.Si vous n'êtes pas un grand fan de la surcharge des opérateurs, ou tout simplement plus d'un type fonctionnel:
la source
Ma méthode préférée depuis Swift 2.0 est aplatir
Cela reviendra
FlattenBidirectionalCollection
donc si vous voulez juste unCollectionType
ce sera suffisant et vous aurez une évaluation paresseuse gratuitement. Si vous avez exactement besoin du tableau, vous pouvez le faire:la source
flatten()
ne semble plus exister de nos jours. Mais vous pouvez envisagerjoined()
.Pour compléter la liste des alternatives possibles,
reduce
pourrait être utilisé pour implémenter le comportement d' aplatir :La meilleure alternative (performances / mémoire) parmi celles présentées est tout simplement
flatten
, qui enveloppe simplement les tableaux d'origine paresseusement sans créer de nouvelle structure de tableau.Mais remarquez que Aplatir ne retourne pas un
LazyCollection
, de sorte que le comportement paresseux ne sera pas propagé à l'opération suivante le long de la chaîne (map, flatMap, filter, etc ...).Si lazyness est logique dans votre cas particulier, rappelez - vous juste ou précédez ajouter un
.lazy
àflatten()
, par exemple, modifier Tomasz exemple de cette façon:la source
Si vous voulez que le deuxième tableau soit inséré après un index particulier, vous pouvez le faire (à partir de Swift 2.2):
la source
Swift 3.0
Vous pouvez créer un nouveau tableau en ajoutant deux tableaux existants avec des types compatibles avec l'opérateur d'addition (
+
). Le type du nouveau tableau est déduit du type des deux tableaux que vous ajoutez ensemble,ce sont les bons résultats des codes ci-dessus.
la source
si vous voulez un résultat comme: [1,2,3, [4,5,6]]
le code ci-dessus convertira arrayOne en un seul élément et l'ajoutera à la fin de arrayTwo.
si vous voulez un résultat comme: [1, 2, 3, 4, 5, 6] alors,
le code ci-dessus ajoutera tous les éléments de arrayOne à la fin de arrayTwo.
Merci.
la source
Swift 4.X
la façon la plus simple que je connaisse est d'utiliser simplement le signe +
la source
Voici le moyen le plus court de fusionner deux tableaux.
Les concaténer / les fusionner
la source
De même, avec les dictionnaires de tableaux, on peut:
et vous pouvez itérer sur dict1 et ajouter dict2 si la "clé" correspond
la source
Tableau Marge de différents types de données:
Production :
la source