如果我想创建一个四维字符串数组,我可以输入:
var array4 = [[[[String]]]]()
如果我想初始化一维数组,我可以使用:
var array1 = [String](repeating: nil, count 10)
那么如何初始化四维字符串数组?
var array4 = [[[[String]]]](repeating: nil, count: 10)
不起作用并且给出“表达式类型不明确”错误。
答案 0 :(得分:1)
你错了,array1
的声明也会给你错误。
var array1 = [String](repeating: nil, count: 10) //This will not compile
还会给你错误
表情类型' [String]'在没有更多背景的情况下是模棱两可的"
由于您无法将nil
值设置为String
,因此您可以将其设置为String?
,因此您需要声明类型为[String?]
的数组。
var array1 = [String?](repeating: nil, count: 10) //This will compile
同样适用于array4
。您可以像这样声明array4
var array4 = [[[[String]]]?](repeating: nil, count: 10) //With nil objects
或强>
var array4 = [[[[String]]]](repeating: [], count: 10) //With empty array objects
答案 1 :(得分:1)
我希望您真正想要的是声明一个指定大小的4D数组,然后通过引用索引a[0][1][0][1] = "something"
来填充它。
为了举个例子,我们假设你想要一个超立方体每个角落的字符串(唯一的#34;具体的"例子我可以想到一个4D的头顶数组是4D几何)。然后顶点索引将是 [0,0,0,0] [0,0,0,1] ... [1,1,1,0] [1,1,1,1] - 总共16个。长手(可能长度= 2)我们有:
var a: [[[[String]]]]
a = [
[
[
["?", "?"], ["?", "?"]
],
[
["?", "?"], ["?", "?"]
],
],
[
[
["?", "?"], ["?", "?"]
],
[
["?", "?"], ["?", "?"]
],
]
]
现在,我们注意到每个维度只是前一维度的副本n次(在这种情况下为2),所以一般来说我们要定义:
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
答案 2 :(得分:0)
typealias TwoDimensionArray<T> = [Array<T>]
typealias ThreeDimensionArray<T> = [TwoDimensionArray<T>]
typealias FourDimensionArray<T> = [ThreeDimensionArray<T>]
var array4 = FourDimensionArray<String>.init(repeating: [], count: 10)
print(array4) // [[], [], [], [], [], [], [], [], [], []]