¿Cómo se crea una matriz inmutable en Swift?

¿Cómo creo una matriz inmutable en Swift?

Una lectura superficial de los documentos sugiere que puede hacer

let myArray = [1,2,3] 

Pero, lamentablemente, esto produce una matriz mutable de tamaño fijo. Esta mutabilidad crea los acertijos habituales con un alias insospechado y funciones que mutan sus argumentos:

 let outterArray = [myArray, myArray] outterArray[0][0] = 2000 outterArray //=> [[2000,2,3],[2000,2,3]] surprise! func notReallyPure(arr:Int[]) -> () { arr[0] = 3000 } notReallyPure(myArray) myArray // => [3000,2,3] 

No mucho mejor que C.

Si quiero inmutabilidad, es la mejor opción para envolverlo en un NSArray como ese:

 let immutableArray = NSArray(myArray: [1,2,3]) 

Eso parece una locura ¿Que me estoy perdiendo aqui?

ACTUALIZACIÓN (2015-07-26):

Esta pregunta data de los primeros días de Swift. Desde entonces, Swift se ha actualizado para que las matrices inmutables sean realmente inmutables, como lo indican las respuestas a continuación.

Esto ha cambiado con Xcode 6 beta 3. Mientras que las matrices solían ser semi-mutables, como usted describe, con sus elementos modificables pero su longitud fija, ahora las matrices inmutables comparten la misma semántica de valores que los diccionarios:

De las notas de la versión Xcode 6 beta 3:

• Array en Swift ha sido completamente rediseñado para tener una semántica de valor completo como Dictionary y String siempre han tenido en Swift. Esto resuelve varios problemas de mutabilidad: ahora una matriz ‘let’ es completamente inmutable, y una matriz ‘var’ es completamente mutable: se compone adecuadamente con Dictionary y String, y resuelve otros problemas más profundos. La semántica del valor puede sorprender si está acostumbrado a las matrices NSArray o C: una copia de la matriz ahora produce una copia completa e independiente de todos los elementos utilizando una implementación eficiente de copia diferida. Este es un cambio importante para Array, y todavía hay algunos problemas de rendimiento que deben abordarse. Por favor, consulte el lenguaje de progtwigción Swift para más información. (17192555)

La información original sobre matrices en el libro Swift se actualizó el 7 de julio de 2014 para reflejar los cambios beta 3. (Si está usando iBooks en una Mac, como yo lo hice, es posible que deba eliminarla y volver a descargarla para buscar la actualización del 7 de julio; no pude actualizarla automáticamente).

Parece ser un error y se solucionará pronto.

Citado del foro de desarrollo de Apple :

Pregunta:

Inconsistencia con let para Array y Dictionary

Respuesta final:

Esto se considera un error, no una característica, y se solucionará en una Beta posterior.
-Chris

No hay una gran respuesta para esto, y es extraño.

Sin embargo, puede evitar la mutación accidental de las matrices a medida que fluyen a través de su progtwig llamando a su yourArray.unshare() . Esto hace que la matriz se copie cuando se asigna a una nueva variable.

Ahora es posible.

Del desarrollador de Apple

Si asigna una matriz o un diccionario a una constante, esa matriz o diccionario es inmutable, y su tamaño y contenido no se pueden cambiar.

Y ahora

 let myArray = [1,2,3] 

produce una matriz completamente inmutable . ¡Hurra!

En mi humilde opinión, la solución más simple es simplemente envolverlo en el cierre de la siguiente manera:

 let mutableElements = [0,1,2,3] let reallyImmutable = {[0,1,2,3]} println(mutableElements) for i in 0..mutableElements.count { mutableElements[i] *= -1 } println(mutableElements) // [0, -1, -2, -3] println(reallyImmutable()) for i in 0..reallyImmutable().count { reallyImmutable()[i] *= -1 } println(reallyImmutable()) // [0, 1, 2, 3] println(reallyImmutable()[2]) // 2 let anotherImmutable = { reallyImmutable().map{ $0 * $0 } } println(anotherImmutable()) // [0, 1, 4, 9] 

Usted paga {} más en la statement y () por cada acceso, pero eso también hace que su código hable por sí mismo.

Dan el progtwigdor mutable

PS Escribió una clase contenedora ImmutableArray .