[AnyObect]? ist nicht identisch mit CGFloat. Während der Verkettung mit AnyObject-Arrays.
Khunshan
6
Khunshan: Zeigt AnyObjectein Objekt an, was meines Wissens etwas bedeutet, das von einem Klassentyp instanziiert wird. CGFloatist kein Objekt, es ist ein Skalarwert. Nach meinem Verständnis können Arrays Skalare enthalten, sofern sie nicht als enthaltend AnyObjectoder weiter verfeinert definiert sind. Ich vermute jedoch, dass das Problem darin besteht, dass das Array in ein optionales Element eingeschlossen ist, sodass Sie es zuerst mit !oder ?zuerst auspacken müssen .
Owen Godfrey
Wissen wir, ob sich die Copy-On-Write-Intelligenz von Swift 2 auf die Bestimmung erstreckt, ob der bTeil von ageändert wurde (daher möglicherweise eine Kopie von bwährend entfernt wird a.appendContentsOf(b))?
Ephemera
1
@ OwenGodfrey danke. Ich habe ein wenig Verwirrung über appendContentsOf und insertContentsOf.
Der folgende Playground-Beispielcode zeigt, wie zwei Arrays vom Typ [Int]mit einem +(_:_:)generischen Operator zu einem neuen Array zusammengeführt werden :
let array1=[1,2,3]let array2=[4,5,6]let flattenArray = array1+ array2
print(flattenArray)// prints [1,2,3,4,5,6]
# 2. Fügen Sie die Elemente eines Arrays mit Arraydem +=(_:_:)generischen Operator von ' in ein vorhandenes Array ein
Arrayhat einen +=(_:_:)generischen Operator. +=(_:_:)hat die folgende Erklärung :
Hängt die Elemente einer Sequenz an eine vom Bereich austauschbare Sammlung an.
Der folgende Playground-Beispielcode zeigt, wie die Elemente eines Arrays vom Typ [Int]mit einem +=(_:_:)generischen Operator an ein vorhandenes Array angehängt werden:
var array1=[1,2,3]let array2=[4,5,6]
array1+= array2
print(array1)// prints [1,2,3,4,5,6]
#3. Hängen Sie ein Array mit Arrayder append(contentsOf:)Methode von an ein anderes Array an
Swift Arrayhat eine append(contentsOf:)Methode. append(contentsOf:)hat die folgende Erklärung :
Fügt die Elemente einer Sequenz oder Sammlung am Ende dieser Sammlung hinzu.
mutatingfunc append<S>(contentsOf newElements: S)where S :Sequence,Self.Element== S.Element
Der folgende Beispielcode für den Spielplatz zeigt, wie ein Array [Int]mithilfe der folgenden append(contentsOf:)Methode an ein anderes Array vom Typ angehängt wird:
var array1=[1,2,3]let array2=[4,5,6]
array1.append(contentsOf: array2)
print(array1)// prints [1,2,3,4,5,6]
# 4. Führen Sie zwei Arrays mit Sequenceder flatMap(_:)Methode von ' zu einem neuen Array zusammen
Swift bietet eine flatMap(_:)Methode für alle Typen, die dem SequenceProtokoll entsprechen (einschließlich Array). flatMap(_:)hat die folgende Erklärung :
Gibt ein Array zurück, das die verketteten Ergebnisse des Aufrufs der angegebenen Transformation mit jedem Element dieser Sequenz enthält.
Der folgende Playground-Beispielcode zeigt, wie zwei Arrays vom Typ [Int]mithilfe der folgenden flatMap(_:)Methode zu einem neuen Array zusammengeführt werden :
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. Führen Sie zwei Arrays mit Sequenceder joined()Methode und Arraydem init(_:)Initialisierer eines neuen Arrays zu einem neuen Array zusammen
Swift bietet eine joined()Methode für alle Typen, die dem SequenceProtokoll entsprechen (einschließlich Array). joined()hat die folgende Erklärung :
Gibt die verketteten Elemente dieser Sequenz von Sequenzen zurück.
func joined()->FlattenSequence<Self>
Außerdem hat Swift Arrayeinen init(_:)Initialisierer. init(_:)hat die folgende Erklärung :
Erstellt ein Array mit den Elementen einer Sequenz.
init<S>(_ s: S)whereElement== S.Element, S :Sequence
Daher zeigt der folgende Playground-Beispielcode, wie zwei Arrays vom Typ [Int]mithilfe von joined()Methode und init(_:)Initialisierer zu einem neuen Array zusammengeführt werden :
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. Führen Sie zwei Arrays mit Arrayder reduce(_:_:)Methode von ' zu einem neuen Array zusammen
Swift Arrayhat eine reduce(_:_:)Methode. reduce(_:_:)hat die folgende Erklärung :
Gibt das Ergebnis der Kombination der Elemente der Sequenz mit dem angegebenen Abschluss zurück.
Der folgende Spielplatzcode zeigt, wie zwei Arrays vom Typ [Int]mithilfe der folgenden reduce(_:_:)Methode zu einem neuen Array zusammengeführt werden :
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]
Vielen Dank für das Teilen dieses Codes, eine gute Erklärung, nur eine Ergänzung zu Ihrer Antwort. Es wäre am besten, wenn Sie sagen, welcher Code durch die Leistung effizienter ist.
Kokemomuke
Ich mag +für 2 Arrays und joined()für ein Array von Arrays.
Cœur
Wenn Sie mehr als 2 Arrays (oder Strings oder was auch immer) zusammenführen, dürfen Sie den +Operator nicht verwenden. Dies führt zu absolut verrückten Kompilierungszeiten.
Lawicko
@lawicko welche Methode wirst du empfehlen?
CyberMew
@CyberMew Alles, was keine überladenen Operatoren verwendet, gefällt mir Methode 3, weil ich denke, dass sie am besten lesbar ist, aber ich mag auch Methode 4 mit der flachen Karte. Für Strings mag ich Methode 5, weil Sie am Ende sofort den verbundenen String bekommen.
Lawicko
34
Wenn Sie kein großer Fan von Überlastung des Bedieners oder eher ein Funktionstyp sind:
// 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]
Meine Lieblingsmethode seit Swift 2.0 ist Abflachen
var a:[CGFloat]=[1,2,3]var b:[CGFloat]=[4,5,6]let c =[a, b].flatten()
Dies wird zurückkehren FlattenBidirectionalCollection, wenn Sie nur eine wollen, CollectionTypewird dies ausreichen und Sie werden eine faule Bewertung kostenlos haben. Wenn Sie genau das Array benötigen, können Sie dies tun:
flatten()scheint heutzutage nicht mehr zu existieren. Aber Sie können überlegen joined().
Cœur
13
Um die Liste der möglichen Alternativen zu vervollständigen, reducekönnte verwendet werden, um das Verhalten von Abflachen zu implementieren :
var a =["a","b","c"]var b =["d","e","f"]let res =[a, b].reduce([],combine:+)
Die beste Alternative (Leistung / Speicher) unter den vorgestellten ist einfach flatten, die ursprünglichen Arrays nur träge zu verpacken, ohne eine neue Array-Struktur zu erstellen.
Beachten Sie aber , dass Flatten nicht zurück ein LazyCollection, so dass faule Verhalten wird nicht entlang der Kette (Karte, flatMap, Filter, etc ...) , um die nächste Operation vermehrt werden.
Wenn lazyness Sinn in Ihrem speziellen Fall macht, nur nicht vergessen , zu prepend oder hängen Sie .lazyan flatten(), zum Beispiel zu modifizieren Tomasz Probe auf diese Weise:
Sie können ein neues Array erstellen, indem Sie zwei vorhandene Arrays mit kompatiblen Typen mit dem Additionsoperator ( +) addieren . Der Typ des neuen Arrays wird aus dem Typ der beiden Arrays abgeleitet, die Sie zusammenfügen.
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]
Antworten:
Sie können die Arrays mit verketten
+
und ein neues Array erstellenoder hängen Sie ein Array mit
+=
(oderappend
) an das andere an :quelle
AnyObject
ein Objekt an, was meines Wissens etwas bedeutet, das von einem Klassentyp instanziiert wird.CGFloat
ist kein Objekt, es ist ein Skalarwert. Nach meinem Verständnis können Arrays Skalare enthalten, sofern sie nicht als enthaltendAnyObject
oder weiter verfeinert definiert sind. Ich vermute jedoch, dass das Problem darin besteht, dass das Array in ein optionales Element eingeschlossen ist, sodass Sie es zuerst mit!
oder?
zuerst auspacken müssen .b
Teil vona
geändert wurde (daher möglicherweise eine Kopie vonb
während entfernt wirda.appendContentsOf(b)
)?Mit Swift 5 können Sie je nach Bedarf eine der sechs folgenden Möglichkeiten wählen, um zwei Arrays zu verketten / zusammenzuführen.
# 1. Führen Sie zwei Arrays mit
Array
dem+(_:_:)
generischen Operator 's zu einem neuen Array zusammenArray
hat einen+(_:_:)
generischen Operator.+(_:_:)
hat die folgende Erklärung :Der folgende Playground-Beispielcode zeigt, wie zwei Arrays vom Typ
[Int]
mit einem+(_:_:)
generischen Operator zu einem neuen Array zusammengeführt werden :# 2. Fügen Sie die Elemente eines Arrays mit
Array
dem+=(_:_:)
generischen Operator von ' in ein vorhandenes Array einArray
hat einen+=(_:_:)
generischen Operator.+=(_:_:)
hat die folgende Erklärung :Der folgende Playground-Beispielcode zeigt, wie die Elemente eines Arrays vom Typ
[Int]
mit einem+=(_:_:)
generischen Operator an ein vorhandenes Array angehängt werden:#3. Hängen Sie ein Array mit
Array
derappend(contentsOf:)
Methode von an ein anderes Array anSwift
Array
hat eineappend(contentsOf:)
Methode.append(contentsOf:)
hat die folgende Erklärung :Der folgende Beispielcode für den Spielplatz zeigt, wie ein Array
[Int]
mithilfe der folgendenappend(contentsOf:)
Methode an ein anderes Array vom Typ angehängt wird:# 4. Führen Sie zwei Arrays mit
Sequence
derflatMap(_:)
Methode von ' zu einem neuen Array zusammenSwift bietet eine
flatMap(_:)
Methode für alle Typen, die demSequence
Protokoll entsprechen (einschließlichArray
).flatMap(_:)
hat die folgende Erklärung :Der folgende Playground-Beispielcode zeigt, wie zwei Arrays vom Typ
[Int]
mithilfe der folgendenflatMap(_:)
Methode zu einem neuen Array zusammengeführt werden :# 5. Führen Sie zwei Arrays mit
Sequence
derjoined()
Methode undArray
deminit(_:)
Initialisierer eines neuen Arrays zu einem neuen Array zusammenSwift bietet eine
joined()
Methode für alle Typen, die demSequence
Protokoll entsprechen (einschließlichArray
).joined()
hat die folgende Erklärung :Außerdem hat Swift
Array
eineninit(_:)
Initialisierer.init(_:)
hat die folgende Erklärung :Daher zeigt der folgende Playground-Beispielcode, wie zwei Arrays vom Typ
[Int]
mithilfe vonjoined()
Methode undinit(_:)
Initialisierer zu einem neuen Array zusammengeführt werden :# 6. Führen Sie zwei Arrays mit
Array
derreduce(_:_:)
Methode von ' zu einem neuen Array zusammenSwift
Array
hat einereduce(_:_:)
Methode.reduce(_:_:)
hat die folgende Erklärung :Der folgende Spielplatzcode zeigt, wie zwei Arrays vom Typ
[Int]
mithilfe der folgendenreduce(_:_:)
Methode zu einem neuen Array zusammengeführt werden :quelle
+
für 2 Arrays undjoined()
für ein Array von Arrays.+
Operator nicht verwenden. Dies führt zu absolut verrückten Kompilierungszeiten.Wenn Sie kein großer Fan von Überlastung des Bedieners oder eher ein Funktionstyp sind:
quelle
Meine Lieblingsmethode seit Swift 2.0 ist Abflachen
Dies wird zurückkehren
FlattenBidirectionalCollection
, wenn Sie nur eine wollen,CollectionType
wird dies ausreichen und Sie werden eine faule Bewertung kostenlos haben. Wenn Sie genau das Array benötigen, können Sie dies tun:quelle
flatten()
scheint heutzutage nicht mehr zu existieren. Aber Sie können überlegenjoined()
.Um die Liste der möglichen Alternativen zu vervollständigen,
reduce
könnte verwendet werden, um das Verhalten von Abflachen zu implementieren :Die beste Alternative (Leistung / Speicher) unter den vorgestellten ist einfach
flatten
, die ursprünglichen Arrays nur träge zu verpacken, ohne eine neue Array-Struktur zu erstellen.Beachten Sie aber , dass Flatten nicht zurück ein
LazyCollection
, so dass faule Verhalten wird nicht entlang der Kette (Karte, flatMap, Filter, etc ...) , um die nächste Operation vermehrt werden.Wenn lazyness Sinn in Ihrem speziellen Fall macht, nur nicht vergessen , zu prepend oder hängen Sie
.lazy
anflatten()
, zum Beispiel zu modifizieren Tomasz Probe auf diese Weise:quelle
Wenn Sie möchten, dass das zweite Array nach einem bestimmten Index eingefügt wird, können Sie dies tun (ab Swift 2.2):
quelle
Swift 3.0
Sie können ein neues Array erstellen, indem Sie zwei vorhandene Arrays mit kompatiblen Typen mit dem Additionsoperator (
+
) addieren . Der Typ des neuen Arrays wird aus dem Typ der beiden Arrays abgeleitet, die Sie zusammenfügen.Dies ist das richtige Ergebnis der obigen Codes.
quelle
wenn Sie ein Ergebnis wünschen als: [1,2,3, [4,5,6]]
Der obige Code konvertiert arrayOne als einzelnes Element und fügt es am Ende von arrayTwo hinzu.
Wenn Sie ein Ergebnis wie folgt wünschen: [1, 2, 3, 4, 5, 6], dann
Der obige Code fügt alle Elemente von arrayOne am Ende von arrayTwo hinzu.
Vielen Dank.
quelle
Swift 4.X.
Der einfachste Weg, den ich kenne, besteht darin, einfach das + -Zeichen zu verwenden
quelle
Hier ist der kürzeste Weg, um zwei Arrays zusammenzuführen.
Verketten / Zusammenführen
quelle
Ebenso kann man mit Wörterbüchern von Arrays:
und Sie können über dict1 iterieren und dict2 hinzufügen, wenn der "Schlüssel" übereinstimmt
quelle
Marge-Array mit unterschiedlichen Datentypen:
Ausgabe :
quelle