Comment 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()
Comment 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()
Réponses:
Les tableaux ont une sémantique pleine valeur dans Swift, il n'y a donc pas besoin de quelque chose d'extraordinaire.
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 copiera que les pointeurs vers vos objets. Pour effectuer une copie complète du contenu, vous utiliseriez map
et exécuteriez plutôt une copie de chaque instance. Pour les classes Foundation conformes au NSCopying
protocole, vous pouvez utiliser la copy()
méthode:
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 qu'il y a des pièges contre lesquels la sémantique des valeurs de Swift travaille pour vous protéger - par exemple, étant donné que NSArray
représente un tableau immuable, sa copy
méthode renvoie simplement une référence à elle-même, de sorte que le test ci-dessus donnerait des résultats inattendus.
var x = [UIView(), UIView(), UIView()] var y = x for i in x { NSLog("%p", i) } println("---") for i in y { NSLog("%p", i) }
et j'ai obtenu cette sortie: 0x7fa82b0009e0 0x7fa82b012660 0x7fa82b012770 ---0x7fa82b0009e0 0x7fa82b012660 0x7fa82b012770
ne semble pas être copié, savez-vous pourquoi?
x[0] == x[1]
mais x[0] === y[0]
devrait échouer
Nate a raison. Si vous travaillez avec des tableaux primitifs, tout ce que vous avez à faire est d'assigner duplicateArray à l'originalArray.
Par souci d'exhaustivité, si vous travailliez sur un objet NSArray, procédez comme suit pour faire 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 * La modification commence ici
Ci-dessus est essentiellement le même que ci-dessous et l'utilisation de l'opérateur d'égalité ci-dessous fonctionnera mieux car le tableau ne sera pas copié à moins qu'il ne soit modifié (c'est par conception).
let z = x
En savoir plus ici: https://developer.apple.com/swift/blog/?id=10
* EDITED * la modification se termine ici
l'ajout ou la suppression de ce tableau n'affectera pas le tableau d'origine. Cependant, la modification des propriétés des objets 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 contient des objets, pas des nombres primitifs).
var array1: [String] = ["john", "alan", "kristen"]; print(array1); var array2 = array1.map { $0 }; print(array2); array2[0] = "james"; print(array1); print(array2);
NSCopying
, alors dupliquez un tableau:let z = x.map { $0.copy as! ClassX }
Pour les objets normaux, ce qui peut être fait est d'implémenter un protocole prenant en charge la copie et de faire en sorte que la classe d'objets implémente ce protocole comme ceci:
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 tout, pour afficher le code et un échantillon, vérifiez ce point essentiel
object's
fonction init
Si vous souhaitez copier les éléments d'un tableau d'un objet de classe. Ensuite, vous pouvez suivre le code ci-dessous sans utiliser le protocole NSCopying mais vous devez avoir une méthode init qui devrait prendre tous les paramètres requis pour votre objet. Voici le code d'un exemple à tester sur terrain de jeu.
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