在Swift中填充多维数组

我是Swift的新手,我遇到了Swift语言的问题。

我应该创建一个函数,它创建一个二维矩阵NxN并找到对角线元素的总和。 使用随机值填充数组时遇到了一些问题。

那是我的代码:

import Foundation func diagonal (N:Int) { var array: [[Int]] = [[0],[0]] for row in 0...N { for col in 0...N { var z = Int(arc4random_uniform(100)) array[row][col] = z } } println (array) } 

它不起作用。

所以我期待着你的帮助。

@ matt的回答对您当前的代码提出了一些好处,并强调了您需要修复的内容。 我想提供一个填充二维数组的替代答案。 您可以使用append添加新值,而不是使用零填充数组,然后设置每个行/列值,例如:

 func diagonal (N:Int) { var array: [[Int]] = [] for row in 0.. 

使用它:

 diagonal(2) // [[40, 58], [44, 83]] 

你是说:

 array[row][col] = z 

Swift中没有“稀疏”数组。 如果row不存在 – 也就是说,如果array[row]引用的索引大于最后一个现有的array索引 – 那么你将崩溃。 你不能简单地分配array[row][col]并期望魔法发生; 你必须确保 array[row][col] 存在

另一个问题是你将范围运算符与..<混淆了。 在你的for row in 0...N的循环中for row in 0...N你将循环N + 1次,好像数组由N + 1个元素组成。 那可能不是你想要的; 您可能希望N代表元素的数量。 所以你需要使用..<而不是。

因此,总结我刚刚说过的所有内容并将其付诸实践,如果您更换相关的三行,您的代码将运行而不会崩溃:

 var array: [[Int]] = Array(count:N, repeatedValue:Array(count:N, repeatedValue:0)) for row in 0.. 

这不是唯一的方法,甚至是你想要做的最好的方式,但至少它是有道理的,这比你的代码可以声称的更多!

 public func getLine() -> String { var buf = String() var c = getchar() while c != EOF && c != 10 { buf.append(Character(UnicodeScalar(UInt32(c))!)) c = getchar() } return buf } print("Enter value of Rows and Coloums :") let rows = Int(getLine()) let coloums = Int(getLine()) print("Enter values in Array(rows * coloums):") var array = [[Int]]() for i in 0 ..< (rows ?? 0){ var rowArray = [Int]() for j in 0 ..< (coloums ?? 0) { rowArray.append(Int(getLine())!) } array.append(rowArray) } print(array)