Zusammenführen von Arrays in Swift: von + bis copy-on-write

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Wie man Arrays in Swift zusammenführt? Vollständige Analyse mit Beispielen und Performance-Geheimnissen



Wenn Sie jemals in Swift programmiert haben, sind Sie bestimmt auf die Aufgabe gestoßen: „Ich habe zwei Arrays, wie mache ich daraus eines?“. Die Frage scheint einfach, aber dahinter verbirgt sich eine ganze Welt voller Optimierungen und Nuancen. Auf Stack Overflow hat diese Frage tausende Aufrufe – und das zu Recht. Heute zeigen wir nicht nur, wie man Code schreibt, sondern werfen einen Blick unter die Haube des Compilers und erfahren, was wirklich passiert, wenn Sie array1 + array2 schreiben. Los geht's!



Die offensichtlichste Methode: Der +-Operator



Beginnen wir mit dem Klassiker. In Swift können Arrays wie Zahlen addiert werden:



let first = [1, 2, 3]let second = [4, 5, 6]let result = first + secondprint(result) // [1, 2, 3, 4, 5, 6]


Schön, oder? Schnell? Nicht immer. Wenn Sie + verwenden, erstellt Swift ein neues Array und kopiert die Elemente aus beiden ursprünglichen Arrays hinein. Wenn Ihre Arrays groß sind (sagen wir, jeweils 100.000 Elemente), ist das doppelte Arbeit für die CPU. Aber warten Sie – es gibt eine Nuance namens copy-on-write (COW).



Die Magie von Copy-on-Write: Wie Swift Speicher spart



Swift ist eine intelligente Sprache. Wenn Sie einfach ein Array einem anderen zuweisen, kopiert es die Daten nicht sofort:



var a = [1, 2, 3]var b = a // Solange die Daten nicht geändert werden, verweisen a und b auf denselben Speicherbereichb.append(4) // Hier findet die eigentliche Kopie statt: b erhält seine eigene Kopie


Dies nennt man copy-on-write. Aber beim Zusammenführen mit + funktioniert das nicht – das Ergebnis ist immer ein neues Array. Warum? Weil wir nicht nur auf alte Daten verweisen, sondern eine neue Sammlung aus Elementen von zwei verschiedenen Quellen erstellen. Der Compiler kann nicht garantieren, dass die ursprünglichen Arrays nicht geändert werden, daher erstellt er eine vollständige Kopie.



Die Methode append(contentsOf:): Wenn Geschwindigkeit wichtiger ist



Wenn Sie die Elemente eines Arrays an das Ende eines anderen anhängen möchten, ohne ein drittes Array zu erstellen, verwenden Sie append(contentsOf:):



var numbers = [1, 2, 3]let moreNumbers = [4, 5, 6]numbers.append(contentsOf: moreNumbers)print(numbers) // [1, 2, 3, 4, 5, 6]


In diesem Fall erstellt Swift kein neues Array – es erweitert das vorhandene. Wenn im Array numbers genügend reservierter Speicher (capacity) vorhanden ist, werden die neuen Elemente einfach in den freien Platz kopiert. Wenn nicht, erfolgt eine Speicherneuzuweisung, aber das ist immer noch schneller, als ein Array von Grund auf neu zu erstellen.



Profi-Tipp: Wenn Sie wissen, dass Sie viele Elemente hinzufügen werden, reservieren Sie vorab Speicher mit reserveCapacity():



var bigArray: [Int] = []bigArray.reserveCapacity(1000)for i in 0..<1000 {    bigArray.append(i) // Kein einziges überflüssiges Kopieren!}


Die Methode flatMap: Zusammenführen von Arrays mit Transformation



Manchmal müssen Arrays nicht nur verbunden, sondern auch jedes Element transformiert werden. Hier kommt flatMap (oder compactMap für Optionals) ins Spiel. Streng genommen ist flatMap zum „Glätten“ von Sammlungen gedacht, aber es kann auch zur Verkettung verwendet werden:



let arrays = [[1, 2], [3, 4], [5, 6]]let flattened = arrays.flatMap { $0 }print(flattened) // [1, 2, 3, 4, 5, 6]


Unter der Haube macht flatMap dasselbe wie eine Schleife mit append(contentsOf:). Aber der Code wird sauberer und lesbarer. Wenn Sie jedoch nur zwei Arrays verbinden müssen – verwenden Sie nicht flatMap, das ist überflüssig.



reduce(into:) für flexibles Zusammenführen



Wenn Sie ein Array von Arrays haben und diese mit zusätzlicher Logik zusammenführen möchten, probieren Sie reduce(into:):



let arrayOfArrays = [[1, 2], [3, 4], [5, 6]]let merged = arrayOfArrays.reduce(into: [Int]()) { r                

Blogs

Buchempfehlungen