Conjuntos multidimensionales en Swift

Editar: Como señala Adam Washington, a partir de Beta 6, este código funciona como está, por lo que la pregunta ya no es relevante.

Estoy tratando de crear e iterar a través de una matriz de dos dimensiones:

var array = Array(count:NumColumns, repeatedValue:Array(count:NumRows, repeatedValue:Double())) array[0][0] = 1 array[1][0] = 2 array[2][0] = 3 array[0][1] = 4 array[1][1] = 5 array[2][1] = 6 array[0][2] = 7 array[1][2] = 8 array[2][2] = 9 for column in 0...2 { for row in 0...2 { println("column: \(column) row: \(row) value:\(array[column][row])") } } 

Sin embargo, este es el resultado que obtengo:

 column: 0 row: 0 value:3.0 column: 0 row: 1 value:6.0 column: 0 row: 2 value:9.0 column: 1 row: 0 value:3.0 column: 1 row: 1 value:6.0 column: 1 row: 2 value:9.0 column: 2 row: 0 value:3.0 column: 2 row: 1 value:6.0 column: 2 row: 2 value:9.0 

Parece que la última columna de la fila sobrescribe los otros valores de columna.

¿Lo estoy declarando mal?

Editar: Tal vez una imagen del patio de recreo ayudaría:

Capturado desde el patio de recreo

Como se indica en las otras respuestas, está agregando la misma matriz de filas a cada columna. Para crear una matriz multidimensional, debe usar un bucle

 var NumColumns = 27 var NumRows = 52 var array = Array>() for column in 0..NumColumns { array.append(Array(count:NumRows, repeatedValue:Double())) } 
 var array: Int[][] = [[1,2,3],[4,5,6],[7,8,9]] for first in array { for second in first { println("value \(second)") } } 

Para lograr lo que está buscando, debe inicializar la matriz en la plantilla correcta y luego hacer un ciclo para agregar las matrices de filas y columnas:

 var NumColumns = 27 var NumRows = 52 var array = Array>() var value = 1 for column in 0..NumColumns { var columnArray = Array() for row in 0..NumRows { columnArray.append(value++) } array.append(columnArray) } println("array \(array)") 

Para lectores futuros, aquí hay una solución elegante (5×5):

 var matrix:[[Int]] = [[Int]](count:5, repeatedValue:[Int](count: 5, repeatedValue:0)) 

y un enfoque dynamic:

 var matrix:[[Int]] = [[Int]]() //creates an empty matrix var row = [Int]() //fill this row matrix.append(row) //add this row 

Su problema puede deberse a una deficiencia en una versión anterior de Swift o de XCode Beta. Al trabajar con Xcode versión 6.0 (6A279r) el 21 de agosto de 2014, su código funciona como se esperaba con este resultado:

 columna: 0 fila: 0 valor: 1.0
 columna: 0 fila: 1 valor: 4.0
 columna: 0 fila: 2 valor: 7.0
 columna: 1 fila: 0 valor: 2.0
 columna: 1 fila: 1 valor: 5.0
 columna: 1 fila: 2 valor: 8.0
 columna: 2 fila: 0 valor: 3.0
 columna: 2 fila: 1 valor: 6.0
 columna: 2 fila: 2 valor: 9.0

Acabo de copiar y pegar tu código en un patio Swift y definí dos constantes:

  dejar NumColumns = 3, NumRows = 3 

Usando http://blog.trolieb.com/trouble-multidimensional-arrays-swift/ como un comienzo, agregué generics al mío:

 class Array2DTyped{ var cols:Int, rows:Int var matrix:[T] init(cols:Int, rows:Int, defaultValue:T){ self.cols = cols self.rows = rows matrix = Array(count:cols*rows,repeatedValue:defaultValue) } subscript(col:Int, row:Int) -> T { get{ return matrix[cols * row + col] } set{ matrix[cols * row + col] = newValue } } func colCount() -> Int { return self.cols } func rowCount() -> Int { return self.rows } } 

Está creando una matriz de tres elementos y asignándolos a la misma cosa, que a su vez es una matriz de tres elementos (tres Dobles).

Cuando haces las modificaciones, estás modificando los flotantes en la matriz interna.

Su lógica original para crear la matriz es de hecho correcta, e incluso funciona en Swift 2. El problema es que en el ciclo de impresión, tiene las variables de fila y columna invertidas. Si lo cambias a:

 for row in 0...2 { for column in 0...2 { print("column: \(column) row: \(row) value:\(array[column][row])") } } 

obtendrás los resultados correctos. ¡Espero que esto ayude!