¿Cómo hago una copia duplicada exacta de una matriz?

¿Cómo podría hacer un duplicado exacto de una matriz?

Tengo dificultades para encontrar información sobre cómo duplicar una matriz en Swift.

Intenté usar .copy()

 var originalArray = [1, 2, 3, 4] var duplicateArray = originalArray.copy() 

Las matrices tienen una semántica de valor completo en Swift, por lo que no hay necesidad de nada sofisticado.

var duplicateArray = originalArray es todo lo que necesita.


Si el contenido de su matriz es un tipo de referencia, entonces sí, esto solo copiará los punteros a sus objetos. Para realizar una copia profunda de los contenidos, en su lugar usaría el map y realizaría una copia de cada instancia. Para las clases Foundation que cumplen con el protocolo NSCopying , puede usar el método 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 

Tenga en cuenta que hay riesgos aquí que la semántica de valores de Swift está trabajando para protegerlo, por ejemplo, ya que NSArray representa una matriz inmutable, su método de copy simplemente devuelve una referencia a sí mismo, por lo que la prueba anterior arrojará resultados inesperados.

Nate es correcto. Si está trabajando con matrices primitivas, todo lo que necesita hacer es asignar duplicateArray a la matriz original.

Para completar, si estuviera trabajando un objeto NSArray, haría lo siguiente para hacer una copia completa de un NSArray:

 var originalArray = [1, 2, 3, 4] as NSArray var duplicateArray = NSArray(array:originalArray, copyItems: true) 

Para los objetos normales, lo que se puede hacer es implementar un protocolo que admita la copia, y hacer que la clase de objetos implemente este protocolo de esta manera:

 protocol Copying { init(original: Self) } extension Copying { func copy() -> Self { return Self.init(original: self) } } 

Y luego la extensión Array para clonación:

 extension Array where Element: Copying { func clone() -> Array { var copiedArray = Array() for element in self { copiedArray.append(element.copy()) } return copiedArray } } 

y eso es más o menos, para ver el código y una muestra comprobar esta esencia

Hay una tercera opción para la respuesta de Nate:

 let z = x.map { $0 } // different array with same objects 

* EDITADO * la edición comienza aquí

Arriba es esencialmente el mismo que a continuación y, en realidad, utilizar el operador de igualdad a continuación tendrá un mejor rendimiento ya que la matriz no se copiará a menos que se modifique (esto es por diseño).

 let z = x 

Lea más aquí: https://developer.apple.com/swift/blog/?id=10

* EDITADO * La edición termina aquí

agregar o eliminar esta matriz no afectará la matriz original. Sin embargo, el cambio de cualquiera de las propiedades de los objetos que tenga la matriz se verá en la matriz original. Porque los objetos en la matriz no son copias (suponiendo que la matriz contenga objetos, no números primitivos).