Edit: Comme le fait remarquer Adam Washington, à partir de la version 6, ce code fonctionne tel quel, de sorte que la question n’est plus pertinente.
J'essaie de créer et de parcourir 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, voici le résultat obtenu:
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 mal?
Edit: Peut-être une image du terrain de jeu pourrait aider:
Pour les futurs lecteurs, voici une solution élégante (5x5):
var matrix = [[Int]](repeating: [Int](repeating: 0, count: 5), count: 5)
et une approche dynamique:
var matrix = [[Int]]() // creates an empty matrix
var row = [Int]() // fill this row
matrix.append(row) // add this row
Comme indiqué dans 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<Array<Double>>()
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 obtenir ce que vous cherchez, vous devez initialiser le tableau avec le bon modèle, puis effectuer une boucle pour ajouter les tableaux de lignes et de colonnes:
var NumColumns = 27
var NumRows = 52
var array = Array<Array<Int>>()
var value = 1
for column in 0..NumColumns {
var columnArray = Array<Int>()
for row in 0..NumRows {
columnArray.append(value++)
}
array.append(columnArray)
}
println("array \(array)")
Votre problème est peut-être dû à une déficience d'une version antérieure de Swift ou de la version bêta de Xcode. Lorsque vous utilisez 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ées: 2 valeur: 9,0
Je viens de copier et coller votre code dans un terrain de jeu Swift) et définir deux constantes:
laisser NumColumns = 3, NumRows = 3
En utilisant http://blog.trolieb.com/trouble-multidimensional-arrays-Swift/ , j'ai ajouté les génériques au mien:
class Array2DTyped<T>{
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
}
}
Vous créez un tableau de trois éléments et assignez 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 pour la création de la matrice est en effet correcte et fonctionne même dans Swift 2. Le problème est que, dans la boucle d’impression, vous avez les variables de ligne et de colonne inversées. Si vous le modifiez à:
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!