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]