¿Cómo haría un duplicado exacto de una matriz?
Me cuesta encontrar información sobre cómo duplicar una matriz en Swift.
Intenté usar .copy()
var originalArray = [1, 2, 3, 4]
var duplicateArray = originalArray.copy()
¿Cómo haría un duplicado exacto de una matriz?
Me cuesta encontrar información sobre cómo duplicar una matriz en Swift.
Intenté usar .copy()
var originalArray = [1, 2, 3, 4]
var duplicateArray = originalArray.copy()
Respuestas:
Las matrices tienen semántica de valor completo en Swift, por lo que no hay necesidad de nada sofisticado.
var duplicateArray = originalArray
es todo lo que necesitas.
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 map
y realizaría una copia de cada instancia. Para las clases Foundation que se ajustan al NSCopying
protocolo, puede utilizar el copy()
método:
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 aquí existen trampas de las que la semántica de valores de Swift está trabajando para protegerlo; por ejemplo, dado que NSArray
representa una matriz inmutable, su copy
método solo devuelve una referencia a sí mismo, por lo que la prueba anterior arrojaría resultados inesperados.
var x = [UIView(), UIView(), UIView()] var y = x for i in x { NSLog("%p", i) } println("---") for i in y { NSLog("%p", i) }
y obtuve este resultado: 0x7fa82b0009e0 0x7fa82b012660 0x7fa82b012770 ---0x7fa82b0009e0 0x7fa82b012660 0x7fa82b012770
No parece que se esté copiando, ¿sabes por qué?
x[0] == x[1]
pero x[0] === y[0]
debería fallar
Nate tiene razón. Si está trabajando con matrices primitivas, todo lo que necesita hacer es asignar duplicateArray al originalArray.
En aras de la integridad, si estuviera trabajando con 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)
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 lo mismo que a continuación y, en realidad, usar el operador de igualdad a continuación funcionará mejor ya que la matriz no se copiará a menos que se cambie (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 quitar a esta matriz no afectará la matriz original. Sin embargo, cambiar cualquiera de las propiedades de los objetos que contiene la matriz se vería en la matriz original. Porque los objetos en la matriz no son copias (asumiendo que la matriz contiene objetos, no números primitivos).
var array1: [String] = ["john", "alan", "kristen"]; print(array1); var array2 = array1.map { $0 }; print(array2); array2[0] = "james"; print(array1); print(array2);
NSCopying
, entonces duplique una matriz:let z = x.map { $0.copy as! ClassX }
Para los objetos normales, lo que se puede hacer es implementar un protocolo que admita la copia, y hacer que la clase de objeto 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 clonar:
extension Array where Element: Copying {
func clone() -> Array {
var copiedArray = Array<Element>()
for element in self {
copiedArray.append(element.copy())
}
return copiedArray
}
}
y eso es todo, para ver el código y una muestra, consulte esta esencia
object's
función init
Si desea copiar los elementos de una matriz de algún objeto de clase. Luego, puede seguir el siguiente código sin usar el protocolo NSCopying, pero debe tener un método de inicio que debe tomar todos los parámetros que se requieren para su objeto. Aquí está el código de un ejemplo para probar en el patio de recreo.
class ABC {
var a = 0
func myCopy() -> ABC {
return ABC(value: self.a)
}
init(value: Int) {
self.a = value
}
}
var arrayA: [ABC] = [ABC(value: 1)]
var arrayB: [ABC] = arrayA.map { $0.myCopy() }
arrayB.first?.a = 2
print(arrayA.first?.a)//Prints 1
print(arrayB.first?.a)//Prints 2
var duplicateArray = originalArray