copy swift deep-copy

copy - ¿Cómo copiar un "Diccionario" en Swift?



deep-copy (3)

Objeto

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 } }

Uso

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

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

¿Cómo copiar un "Diccionario" en Swift?

Es decir, obtener otro objeto con las mismas claves / valores pero diferente dirección de memoria.

Además, ¿cómo copiar un objeto en Swift?

Gracias,


Todas las respuestas que se dan aquí son excelentes, pero faltan un punto clave relacionado con advertirle sobre las advertencias de la copia.

En Swift, tiene tipos de valor (struct, enum, tuple, array, dict, etc.) o tipos de referencia (clases).

Si necesita copiar un objeto de clase, debe implementar los métodos copyWithZone en su clase y luego llamar a copy en el objeto.

Pero si necesita copiar un objeto de tipo de valor, por ejemplo. y Array puede copiarlo directamente simplemente asignándolo a una nueva variable como:

let myArray = ... let copyOfMyArray = myArray

Pero esto es sólo una copia superficial.

Si su matriz contiene objetos de clase y desea hacer su copia también, entonces debe copiar cada elemento de la matriz individualmente. Esto te permitirá hacer una copia profunda .

Esta es información adicional, que pensé que se agregaría a la información ya presentada en las respuestas bien escritas arriba.


Un ''Diccionario'' es en realidad un Struct en swift, que es un tipo de valor. Así que copiarlo es tan fácil como:

let myDictionary = ... let copyOfMyDictionary = myDictionary

Copiar un objeto (que es un tipo de referencia) tiene un par de respuestas diferentes. Si el objeto adopta el protocolo NSCopying , entonces solo puede hacer:

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

Si su objeto no se ajusta a NSCopying , es posible que no pueda copiar el objeto. Dependiendo de la clase del objeto, puede proporcionar su propio método para obtener una copia duplicada, o si el objeto no tiene un estado privado interno, puede crear un nuevo objeto con las mismas propiedades.

[Editado para corregir un error en la respuesta anterior: NSObject (tanto la Clase como el Protocolo) no proporciona un método de copia o copyWithZone y, por lo tanto, no es suficiente para poder copiar un objeto]