web-dev-qa-db-fra.com

Comment copier un "dictionnaire" dans Swift?

Comment copier un "dictionnaire" dans Swift?

Autrement dit, obtenez un autre objet avec les mêmes clés/valeurs mais une adresse mémoire différente.

De plus, comment copier un objet dans Swift?

Merci,

27
allenlinli

Un "dictionnaire" est en fait une structure dans Swift, qui est un type de valeur. La copie est donc aussi simple que:

let myDictionary = ...
let copyOfMyDictionary = myDictionary

Copier un objet (qui est un type de référence) a deux réponses différentes. Si l'objet adopte le protocole NSCopying, alors vous pouvez simplement faire:

let myObject = ...
let copyOfMyObject = myObject.copy()

Si votre objet n'est pas conforme à NSCopying, vous ne pourrez peut-être pas copier l'objet. Selon la classe de l'objet, il peut fournir sa propre méthode pour obtenir une copie en double, ou si l'objet n'a pas d'état privé interne, vous pouvez créer un nouvel objet avec les mêmes propriétés.

[Modifié pour corriger une erreur dans la réponse précédente - NSObject (à la fois la classe et le protocole) ne fournit pas de méthode copy ou copyWithZone et est donc insuffisant pour pouvoir copier un objet]

67
ikuramedia

Toutes les réponses données ici sont excellentes, mais elles manquent un point clé concernant la mise en garde contre les mises en garde de la copie.

Dans Swift, vous avez soit des types de valeurs (struct, enum, Tuple, array, dict etc.) ou des types de référence (classes).

Si vous devez copier un objet de classe, vous devez alors implémenter les méthodes copyWithZone dans votre classe, puis appeler copy sur l'objet.

Mais si vous en avez besoin, copiez un objet de type valeur, par exemple. et Array vous pouvez le copier directement en l'affectant simplement à une nouvelle variable comme ceci:

let myArray = ...
let copyOfMyArray = myArray

Mais ce n'est qu'une copie superficielle.

Si votre tableau contient objets de classe et que vous souhaitez également effectuer leur copie, vous devez copier chaque élément du tableau individuellement. Cela vous permettra de faire un copie complète.

Ce sont des informations supplémentaires que je pensais ajouter aux informations déjà présentées dans les réponses bien écrites ci-dessus.

7
jarora

Objet

class Person: NSObject, NSCopying {
    var firstName: String
    var lastName: String
    var age: Int

    init(firstName: String, lastName: String, age: Int) {
        self.firstName = firstName
        self.lastName = lastName
        self.age = age
    }

    func copyWithZone(zone: NSZone) -> AnyObject {
        let copy = Person(firstName: firstName, lastName: lastName, age: age)
        return copy
    }
}

Usage

let paul = Person(firstName: "Paul", lastName: "Hudson", age: 35)
let sophie = paul.copy() as! Person

sophie.firstName = "Sophie"
sophie.age = 5

print("\(paul.firstName) \(paul.lastName) is \(paul.age)")
print("\(sophie.firstName) \(sophie.lastName) is \(sophie.age)")

Source: https://www.hackingwithswift.com/example-code/system/how-to-copy-objects-in-Swift-using-copy

2
Blank