Comment pourrais-je faire une copie exacte d'un tableau?
J'ai du mal à trouver des informations sur la duplication d'un tableau dans Swift.
J'ai essayé d'utiliser .copy()
var originalArray = [1, 2, 3, 4]
var duplicateArray = originalArray.copy()
Les tableaux ont une sémantique de valeur complète dans Swift, il n’ya donc rien d’utile à faire.
var duplicateArray = originalArray
est tout ce dont vous avez besoin.
Si le contenu de votre tableau est un type de référence, alors oui, cela ne fera que copier les pointeurs sur vos objets. Pour effectuer une copie complète du contenu, utilisez plutôt map
et effectuez une copie de chaque instance. Pour les classes Foundation conformes au protocole NSCopying
, vous pouvez utiliser la méthode copy()
:
let x = [NSMutableArray(), NSMutableArray(), NSMutableArray()]
let y = x
let z = x.map { $0.copy() }
x[0] === y[0] // true
x[0] === z[0] // false
Notez que la sémantique des valeurs de Swift présente des pièges qui vous protègent. Par exemple, puisque NSArray
représente un tableau immuable, sa méthode copy
renvoie simplement une référence à lui-même. donner des résultats inattendus.
Nate a raison. Si vous travaillez avec des tableaux primitifs, il vous suffit d'affecter duplicateArray à l'original.
Par souci d'exhaustivité, si vous utilisiez un objet NSArray, procédez comme suit pour créer une copie complète d'un NSArray:
var originalArray = [1, 2, 3, 4] as NSArray
var duplicateArray = NSArray(array:originalArray, copyItems: true)
Il y a une troisième option à la réponse de Nate:
let z = x.map { $0 } // different array with same objects
* EDITED * edit commence ici
Ci-dessus est essentiellement identique à ci-dessous et utiliser l'opérateur d'égalité ci-dessous donnera de meilleurs résultats puisque le tableau ne sera copié que s'il est modifié (ceci est voulu par la conception même).
let z = x
Lisez plus ici: https://developer.Apple.com/Swift/blog/?id=1
* EDITED * edit se termine ici
ajouter ou supprimer ce tableau n'affectera pas le tableau d'origine. Cependant, toute modification des propriétés de l'objet contenues dans le tableau serait visible dans le tableau d'origine. Parce que les objets du tableau ne sont pas des copies (en supposant que le tableau contienne des objets, pas des nombres primitifs).
Pour les objets normaux, il est possible d'implémenter un protocole prenant en charge la copie et de faire en sorte que la classe d'objets implémente ce protocole de la manière suivante:
protocol Copying {
init(original: Self)
}
extension Copying {
func copy() -> Self {
return Self.init(original: self)
}
}
Et puis l'extension Array pour le clonage:
extension Array where Element: Copying {
func clone() -> Array {
var copiedArray = Array<Element>()
for element in self {
copiedArray.append(element.copy())
}
return copiedArray
}
}
et c’est à peu près cela, pour voir le code et un exemple, vérifiez ceci Gist