Tableaux multidimensionnels dans Swift

Edit: Comme le souligne Adam Washington, à partir de la version bêta 6, ce code fonctionne tel quel, la question n’est donc plus pertinente.

J’essaie de créer et d’itérer à travers un tableau à deux dimensions:

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])") } } 

Cependant, c’est la sortie que je reçois:

 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 

Il semble que la dernière colonne de la ligne remplace les autres valeurs de colonne.

Est-ce que je le déclare faux?

Edit: Une image du terrain de jeu pourrait peut-être vous aider:

Capturé du terrain de jeu

Comme indiqué par les autres réponses, vous ajoutez le même tableau de lignes à chaque colonne. Pour créer un tableau multidimensionnel, vous devez utiliser une boucle

 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)") } } 

Pour atteindre ce que vous recherchez, vous devez initialiser le tableau au bon modèle, puis effectuer une boucle pour append les tableaux de lignes et de colonnes:

 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)") 

Pour les futurs lecteurs, voici une solution élégante (5×5):

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

et une approche dynamic:

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

Votre problème est peut-être dû à une défaillance d’une version antérieure de Swift ou de la version bêta de XCode. En travaillant avec Xcode Version 6.0 (6A279r) le 21 août 2014, votre code fonctionne comme prévu avec cette sortie:

 colonne: 0 rangée: 0 valeur: 1,0
 colonne: 0 rangée: 1 valeur: 4.0
 colonne: 0 rangée: 2 valeur: 7.0
 colonne: 1 rangée: 0 valeur: 2,0
 colonne: 1 rangée: 1 valeur: 5.0
 colonne: 1 rangée: 2 valeur: 8.0
 colonne: 2 rangée: 0 valeur: 3.0
 colonne: 2 rangées: 1 valeur: 6,0
 colonne: 2 rangée: 2 valeur: 9.0

Je viens de copier et coller votre code dans un terrain de jeu Swift et défini deux constantes:

  let NumColumns = 3, NumRows = 3 

En commençant par http://blog.trolieb.com/trouble-multidimensional-arrays-swift/ , j’ai ajouté des génériques au mien:

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

Vous créez un tableau de trois éléments et vous les atsortingbuez tous les trois à la même chose, qui est elle-même un tableau de trois éléments (trois doubles).

Lorsque vous effectuez les modifications, vous modifiez les flottants dans le tableau interne.

Votre logique d’origine de création de la masortingce est en effet correcte et elle fonctionne même dans Swift 2. Le problème est que dans la boucle d’impression, les variables de ligne et de colonne sont inversées. Si vous le changez pour:

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

vous obtiendrez les bons résultats. J’espère que cela t’aides!