Wie würde ich ein Array exakt duplizieren?
Es fällt mir schwer, Informationen zum Duplizieren eines Arrays in Swift zu finden.
Ich habe es versucht .copy()
var originalArray = [1, 2, 3, 4]
var duplicateArray = originalArray.copy()
Wie würde ich ein Array exakt duplizieren?
Es fällt mir schwer, Informationen zum Duplizieren eines Arrays in Swift zu finden.
Ich habe es versucht .copy()
var originalArray = [1, 2, 3, 4]
var duplicateArray = originalArray.copy()
Antworten:
Arrays haben in Swift eine vollständige Semantik, sodass nichts Besonderes erforderlich ist.
var duplicateArray = originalArray
ist alles, was du brauchst.
Wenn der Inhalt Ihres Arrays ein Referenztyp ist, werden die Zeiger nur auf Ihre Objekte kopiert. Um eine tiefe Kopie des Inhalts zu erstellen, würden Sie stattdessen verwendenmap
eine Kopie jeder Instanz und ausführen. Für Foundation-Klassen, die dem NSCopying
Protokoll entsprechen, können Sie die folgende copy()
Methode verwenden:
let x = [NSMutableArray(), NSMutableArray(), NSMutableArray()]
let y = x
let z = x.map { $0.copy() }
x[0] === y[0] // true
x[0] === z[0] // false
Beachten Sie, dass es hier Fallstricke gibt, vor denen die Wertsemantik von Swift Sie schützt. Da NSArray
sie beispielsweise ein unveränderliches Array darstellt, gibt ihre copy
Methode nur einen Verweis auf sich selbst zurück, sodass der obige Test zu unerwarteten Ergebnissen führen würde.
var x = [UIView(), UIView(), UIView()] var y = x for i in x { NSLog("%p", i) } println("---") for i in y { NSLog("%p", i) }
und habe folgende Ausgabe erhalten: 0x7fa82b0009e0 0x7fa82b012660 0x7fa82b012770 ---0x7fa82b0009e0 0x7fa82b012660 0x7fa82b012770
Sieht nicht so aus, als würde es kopiert, wissen Sie warum?
x[0] == x[1]
aber x[0] === y[0]
sollte scheitern
Nate ist richtig. Wenn Sie mit primitiven Arrays arbeiten, müssen Sie dem OriginalArray lediglich duplicateArray zuweisen.
Der Vollständigkeit halber würden Sie, wenn Sie ein NSArray-Objekt bearbeiten, die folgenden Schritte ausführen, um eine vollständige Kopie eines NSArray zu erstellen:
var originalArray = [1, 2, 3, 4] as NSArray
var duplicateArray = NSArray(array:originalArray, copyItems: true)
Es gibt eine dritte Option für Nates Antwort:
let z = x.map { $0 } // different array with same objects
* BEARBEITET * Bearbeitung beginnt hier
Oben ist im Wesentlichen dasselbe wie unten, und die Verwendung des unten stehenden Gleichheitsoperators führt zu einer besseren Leistung, da das Array nur kopiert wird, wenn es geändert wird (dies ist beabsichtigt).
let z = x
Lesen Sie hier mehr: https://developer.apple.com/swift/blog/?id=10
* BEARBEITET * Bearbeitung endet hier
Das Hinzufügen oder Entfernen zu diesem Array wirkt sich nicht auf das ursprüngliche Array aus. Das Ändern der Eigenschaften eines Objekts, die das Array enthält, wird jedoch im ursprünglichen Array angezeigt. Da die Objekte im Array keine Kopien sind (vorausgesetzt, das Array enthält Objekte, keine primitiven Zahlen).
var array1: [String] = ["john", "alan", "kristen"]; print(array1); var array2 = array1.map { $0 }; print(array2); array2[0] = "james"; print(array1); print(array2);
NSCopying
, dann duplizieren Sie ein Array:let z = x.map { $0.copy as! ClassX }
Für normale Objekte kann ein Protokoll implementiert werden, das das Kopieren unterstützt, und die Objektklasse implementiert dieses Protokoll wie folgt:
protocol Copying {
init(original: Self)
}
extension Copying {
func copy() -> Self {
return Self.init(original: self)
}
}
Und dann die Array-Erweiterung zum Klonen:
extension Array where Element: Copying {
func clone() -> Array {
var copiedArray = Array<Element>()
for element in self {
copiedArray.append(element.copy())
}
return copiedArray
}
}
und das ist so ziemlich alles , um Code und ein Beispiel anzusehen, überprüfen Sie dieses Wesentliche
object's
Init-Funktion
Wenn Sie die Elemente eines Arrays eines Klassenobjekts kopieren möchten. Dann können Sie dem folgenden Code folgen, ohne das NSCopying-Protokoll zu verwenden. Sie benötigen jedoch eine Init-Methode, die alle für Ihr Objekt erforderlichen Parameter übernimmt. Hier ist der Code für ein Beispiel zum Testen auf einem Spielplatz.
class ABC {
var a = 0
func myCopy() -> ABC {
return ABC(value: self.a)
}
init(value: Int) {
self.a = value
}
}
var arrayA: [ABC] = [ABC(value: 1)]
var arrayB: [ABC] = arrayA.map { $0.myCopy() }
arrayB.first?.a = 2
print(arrayA.first?.a)//Prints 1
print(arrayB.first?.a)//Prints 2
var duplicateArray = originalArray