我想到的是要真正做的是声明指定大小的四维阵列,然后往里面指的是指数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)每个“行”(但是您想要在四维中考虑)可以是不同的长度。 –
暂时将其重写为平面阵列。 –