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,
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]
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.
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