2017-02-14 206 views
1

我試圖填充一個多維數組使用此代碼多維數組:填充用循環

var array = [[Int]]() 
     for i in 0...3 { 
      for j in 0...3{ 
       array[i][j] = i + j <<- Error 
      } 

     } 

但我得到一個錯誤:

fatal error: Index out of range 

我在做什麼錯?

回答

2

調用array[i][j]適用於已經存在的元素。你不能用它來初始化數組,因爲目前它只是一個空數組。您應該使用.append來代替。請記住,這實際上不是像Rob Napier所說的多維數組,但它在這種情況下實現了相同的目標。嘗試是這樣的:

var array = [[Int]]() 
for i in 0...3 { 

    var subArray = [Int]() 
    for j in 0...3 { 
     subArray.append(i + j) 
    } 

    array.append(subArray) 
} 

此打印:

[[0, 1, 2, 3], [1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]]

再次,可能不是最好的方法,但是這是你是如何能做到這一點的斯威夫特。

+0

謝謝。工作得很好 – Abdou023

2

[[Int]]不是一個多維數組。它是一個數組數組。這是一個非常不同的事情。例如,在數組數組中,每行可能有不同數量的列。使用嵌套數組作爲多維數組通常是個不錯的主意,特別是可變的數組。修改通常非常低效,因爲每次更改時都會導致大量複製。

Swift沒有多維數組類型。如果你真的需要它,你通常必須自己構建它,或重新設計以避免它。如果它足夠小,而且變化不大,這不是什麼大不了的事情,但不要讓它們變大。

這就是說,問題是元素[0][0]不存在,因爲您沒有創建它。在使用之前,您需要以這種方式初始化陣列:

var array = Array(repeating: Array(repeating: 0, count: 4), count: 4) 

這將創建一個由4個4個零組成的數組。

如果你想明確你所描述的佈局,可能是一個更好的方法是映射,這很可能將是更有效的(因爲它不保留修改嵌套數組):

let array = (0...3).map { i in 
    (0...3).map { j in 
     return i + j 
    } 
} 
+0

感謝您的解釋。 – Abdou023