Antworten:
Sie können die Arrays mit verketten +
und ein neues Array erstellen
let c = a + b
print(c) // [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
oder hängen Sie ein Array mit +=
(oder append
) an das andere an :
a += b
// Or:
a.append(contentsOf: b) // Swift 3
a.appendContentsOf(b) // Swift 2
a.extend(b) // Swift 1.2
print(a) // [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
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 enthaltend AnyObject
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 von a
geändert wurde (daher möglicherweise eine Kopie von b
während entfernt wird a.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.
Array
dem +(_:_:)
generischen Operator 's zu einem neuen Array zusammenArray
hat einen +(_:_:)
generischen Operator. +(_:_:)
hat die folgende Erklärung :
Erstellt eine neue Sammlung, indem die Elemente einer Sammlung und einer Sequenz verkettet werden.
static func + <Other>(lhs: Array<Element>, rhs: Other) -> Array<Element> where Other : Sequence, Self.Element == Other.Element
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]
Array
dem +=(_:_:)
generischen Operator von ' in ein vorhandenes Array einArray
hat einen +=(_:_:)
generischen Operator. +=(_:_:)
hat die folgende Erklärung :
Hängt die Elemente einer Sequenz an eine vom Bereich austauschbare Sammlung an.
static func += <Other>(lhs: inout Array<Element>, rhs: Other) where Other : Sequence, Self.Element == Other.Element
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]
Array
der append(contentsOf:)
Methode von an ein anderes Array anSwift Array
hat eine append(contentsOf:)
Methode. append(contentsOf:)
hat die folgende Erklärung :
Fügt die Elemente einer Sequenz oder Sammlung am Ende dieser Sammlung hinzu.
mutating func 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]
Sequence
der flatMap(_:)
Methode von ' zu einem neuen Array zusammenSwift bietet eine flatMap(_:)
Methode für alle Typen, die dem Sequence
Protokoll 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.
func flatMap<SegmentOfResult>(_ transform: (Self.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
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] in
return element
})
print(flattenArray) // prints [1, 2, 3, 4, 5, 6]
Sequence
der joined()
Methode und Array
dem init(_:)
Initialisierer eines neuen Arrays zu einem neuen Array zusammenSwift bietet eine joined()
Methode für alle Typen, die dem Sequence
Protokoll 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 Array
einen init(_:)
Initialisierer. init(_:)
hat die folgende Erklärung :
Erstellt ein Array mit den Elementen einer Sequenz.
init<S>(_ s: S) where Element == 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]
Array
der reduce(_:_:)
Methode von ' zu einem neuen Array zusammenSwift Array
hat eine reduce(_:_:)
Methode. reduce(_:_:)
hat die folgende Erklärung :
Gibt das Ergebnis der Kombination der Elemente der Sequenz mit dem angegebenen Abschluss zurück.
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
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] in
return result + element
})
print(flattenArray) // prints [1, 2, 3, 4, 5, 6]
+
für 2 Arrays und joined()
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:
// 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, CollectionType
wird dies ausreichen und Sie werden eine faule Bewertung kostenlos haben. Wenn Sie genau das Array benötigen, können Sie dies tun:
let c = Array([a, b].flatten())
Um die Liste der möglichen Alternativen zu vervollständigen, reduce
kö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 .lazy
an flatten()
, zum Beispiel zu modifizieren Tomasz Probe auf diese Weise:
let c = [a, b].lazy.flatten()
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.
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]
Dies ist das richtige Ergebnis der obigen Codes.
var arrayOne = [1,2,3]
var arrayTwo = [4,5,6]
wenn Sie ein Ergebnis wünschen als: [1,2,3, [4,5,6]]
arrayOne.append(arrayTwo)
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
arrayOne.append(contentsOf: arrayTwo)
Der obige Code fügt alle Elemente von arrayOne am Ende von arrayTwo hinzu.
Vielen Dank.
Hier ist der kürzeste Weg, um zwei Arrays zusammenzuführen.
var array1 = [1,2,3]
let array2 = [4,5,6]
Verketten / Zusammenführen
array1 += array2
New value of array1 is [1,2,3,4,5,6]
Ebenso kann man mit Wörterbüchern von Arrays:
var dict1 = [String:[Int]]()
var dict2 = [String:[Int]]()
dict1["key"] = [1,2,3]
dict2["key"] = [4,5,6]
dict1["key"] = dict1["key"]! + dict2["key"]!
print(dict1["key"]!)
und Sie können über dict1 iterieren und dict2 hinzufügen, wenn der "Schlüssel" übereinstimmt
Marge-Array mit unterschiedlichen Datentypen:
var arrayInt = [Int]()
arrayInt.append(6)
var testArray = ["a",true,3,"b"] as [Any]
testArray.append(someInt)
Ausgabe :
["a", true, 3, "b", "hi", 3, [6]]