2017-02-14 96 views
0

如果我想创建一个四维字符串数组我可以输入:Swift 3 - 你如何初始化一个多维字符串数组?

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

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

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

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

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

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

+2

var array1 = [String](repeating:nil,count 10)'不能编译。如果你想将元素初始化为'nil',你需要有一个* optionals *的数组。但实际上,你应该问自己,阵列数组数组是否是一个适合你想要做的数据结构。我怀疑它不是。 – Hamish

+1

请记住,[[[[String]]]]不是一个多维数组。这是一个嵌套数组。这很重要,因为(a)修改它可能会非常昂贵,并且(b)每个“行”(但是您想要在四维中考虑)可以是不同的长度。 –

+0

暂时将其重写为平面阵列。 –

回答

1

你错了,你的申报array1也会给你错误。

var array1 = [String](repeating: nil, count: 10) //This will not compile 

也会给你错误

表达型“[字符串]”是没有更多的上下文”

明确的,因为你不能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 
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) // [[], [], [], [], [], [], [], [], [], []] 
+0

你似乎正在播种之前的数组 - 这是否正确? –

1

我想到的是要真正做的是声明指定大小的四维阵列,然后往里面指的是指数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