Swift中的多维数组

Car*_*ine 48 arrays swift

编辑:正如亚当华盛顿指出的那样,从Beta 6开始,这段代码按原样运行,所以这个问题已经不再适用了.

我正在尝试创建并迭代二维数组:

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])")
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这是我得到的输出:

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
Run Code Online (Sandbox Code Playgroud)

看起来该行中的最后一列正在覆盖其他列值.

我宣布错了吗?

编辑:也许游乐场的照片会有所帮助:

从游乐场捕获

Rod*_*Rod 53

正如其他答案所述,您要为每列添加相同的行数组.要创建多维数组,必须使用循环

var NumColumns = 27
var NumRows = 52
var array = Array<Array<Double>>()
for column in 0..NumColumns {
    array.append(Array(count:NumRows, repeatedValue:Double()))
}
Run Code Online (Sandbox Code Playgroud)

  • `Double [] [](count:NumColumns,repeatedValue:Double [](count:NumRows,repeatedValue:Double()));`如果你不想要一个循环 (9认同)
  • @Literphor,新语法是`[[Double]](count:NumColumns,repeatedValue:[Double](count:NumRows,repeatedValue:Double()));` (6认同)
  • 从beta 3开始,语法略有不同.此外,这只会为您提供对值类型数组有用的东西 - 对于引用类型,您将获得对同一对象的许多引用的数组.更多[此答案](http://stackoverflow.com/a/24812138/957768). (3认同)
  • 多维数组初始化语法给了我足够的契合我写的http://dev.iachieved.it/iachievedit/multidimensional-arrays-in-swift/ (2认同)

bba*_*art 14

var array: Int[][] = [[1,2,3],[4,5,6],[7,8,9]]

for first in array {
    for second in first {
        println("value \(second)")
    }
}
Run Code Online (Sandbox Code Playgroud)

要实现您正在寻找的内容,您需要将数组初始化为正确的模板,然后循环以添加行和列数组:

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)")
Run Code Online (Sandbox Code Playgroud)


ign*_*gog 9

对于未来的读者,这是一个优雅的解决方案(5x5):

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

和动态的方法:

var matrix = [[Int]]() // creates an empty matrix
var row = [Int]() // fill this row
matrix.append(row) // add this row
Run Code Online (Sandbox Code Playgroud)


小智 5

您的问题可能是由于早期版本的Swift或XCode Beta的缺陷造成的.在2014年8月21日使用Xcode版本6.0(6A279r),您的代码按此预期使用此输出:

column: 0 row: 0 value:1.0
column: 0 row: 1 value:4.0
column: 0 row: 2 value:7.0
column: 1 row: 0 value:2.0
column: 1 row: 1 value:5.0
column: 1 row: 2 value:8.0
column: 2 row: 0 value:3.0
column: 2 row: 1 value:6.0
column: 2 row: 2 value:9.0

我只是将您的代码复制并粘贴到Swift游乐场并定义了两个常量:

let NumColumns = 3, NumRows = 3