2017-02-14 52 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