web-dev-qa-db-fra.com

Comment est-ce que je fais une copie dupliquée exacte d'un tableau?

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()
82
Patrick

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.

154
Nate Cook

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)
26
applejack42

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).

17
oyalhi

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

14
Sohayb Hassoun