我想到的是要真正做的是聲明指定大小的四維陣列,然後往裏面指的是指數a[0][1][0][1] = "something"
。
讓我們假設你想要一個超立方體每個角的字符串(唯一的「具體」的例子,我可以想到,我的頭頂4D陣列是一個4D陣列)。那麼頂點索引將是 [0,0,0,0] [0,0,0,1] ... [1,1,1,0] [1,1,1, 1] - 總共16個。長手(可能長度= 2),我們有:
var a: [[[[String]]]]
a = [
[
[
["?", "?"], ["?", "?"]
],
[
["?", "?"], ["?", "?"]
],
],
[
[
["?", "?"], ["?", "?"]
],
[
["?", "?"], ["?", "?"]
],
]
]
現在,我們注意到,每個維度僅僅是一個(在本例中2)上一維N次副本,所以這樣做一般,讓我們定義:
func arrayOf<T>(el: T, count: Int) -> [T] {
return [T](repeatElement(el, count: count))
}
這將是可愛的使用遞歸與像一個函數:
// func arrayOfArrays<T>(el: T, count: Int, depth: Int) -> ??? {
// if depth == 1 { return arrayOf(el: el, count: count) }
// return arrayOf(el: arrayOfArrays(el: el, count: count, depth: depth - 1), count: count)
// }
// a1:[[[[String]]]] = arrayOfArrays(el:"?", count: 2, depth: 4)
,但又有什麼回報?泛型無法應付這種情況,所以我們必須做到這一點:
var a1: [[[[String]]]]
a1 = arrayOf(el: arrayOf(el: arrayOf(el: arrayOf(el: "?", count: 2), count: 2), count: 2), count: 2)
a1[0][0][0][0] // "?" as expected
a1[1][1][1][1] = "!?"
a1[1][1][1][1] // "!?" as required
var array1 = [String](repeating:nil,count 10)'不能編譯。如果你想將元素初始化爲'nil',你需要有一個* optionals *的數組。但實際上,你應該問自己,陣列數組數組是否是一個適合你想要做的數據結構。我懷疑它不是。 – Hamish
請記住,[[[[String]]]]不是一個多維數組。這是一個嵌套數組。這很重要,因爲(a)修改它可能會非常昂貴,並且(b)每個「行」(但是您想要在四維中考慮)可以是不同的長度。 –
暫時將其重寫爲平面陣列。 –