Swift 3 - 如何初始化多维字符串数组?

时间:2017-02-14 10:49:41

标签: arrays swift initialization

如果我想创建一个四维字符串数组,我可以输入:

var array4 = [[[[String]]]]() 

如果我想初始化一维数组,我可以使用:

var array1 = [String](repeating: nil, count 10)

那么如何初始化四维字符串数组?

var array4 = [[[[String]]]](repeating: nil, count: 10)

不起作用并且给出“表达式类型不明确”错误。

3 个答案:

答案 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) // [[], [], [], [], [], [], [], [], [], []]