2016-06-07 31 views
1

我在Objective-C中做了這個,但是我不能在Swift中做我想做的事情。
我想旋轉任何類型的2維數組。我正在使用泛型,以便我可以使用Strings & Ints或任何其他類型。使用多維數組泛型的多個錯誤

import UIKit 

let someArray = [[1,2,3],[7,8,9],[11,93,87]] 

print(someArray[0]) 


func rotateArray<T> (array:[[T]]) ->Array{ 
    var tempArray = [[T]]() 

    for i in 0..<array.count{ 

     for j in 0..<array.count{ 

      tempArray[j][array.count-i-1] = array[i][j] 
     } 

    } 
    return tempArray 

} 

someArray.count 

let x = rotateArray(someArray) 

不過,我得到以下錯誤(有可能是我不知道的其他錯誤),我也看了this question和其他一些人,但不能涉及到它。

  • reference to generic type 'Array' requires arguments in <..>
  • Binary Operator '..<' Cannot be applied to two 'Int' operands
  • 編輯固定最初兩個錯誤後:fatal error: Index out of range

有什麼事情,我做錯了什麼?請包括細節,我是一個完整的菜鳥。

回答

1

除了使你的方法返回類型[[T]],你在這裏有其他問題。你正在實例化tempArray(將存放數組的內部數組),但是你沒有實例化那些內部數組。你不能只使用下標運算符,而是你必須append到你的各自的陣列。

例如,如果你想順時針旋轉90度,這將是:

func rotateArray<T> (array:[[T]]) -> [[T]] { 
    var tempArray = [[T]]() 

    for column in 0 ..< array.first!.count { 
     var rowArray = [T]() 
     for row in (0 ..< array.count).reverse() { 
      rowArray.append(array[row][column]) 
     } 
     tempArray.append(rowArray) 
    } 

    return tempArray 
} 

因此

[[1, 2, 3],
[7, 8, 9],
[11, 93, 87]]

變爲

[[11, 7, 1],
[93, 8, 2],
[87, 9, 3]]

+0

謝謝Rob。你究竟如何解決內部數組的問題 - 沒有被實例化?另外爲什麼我們不能使用下標運算符? – Honey

+1

我們在'for j ...'循環中做的第一件事是我們將一個'[T]()'追加到數組中。這就是我們正在實例化內部數組的地方。爲什麼你不能使用下標操作符?數組下標操作符(與字典不同)意味着「用此值替換此索引處的項目」。它不用於追加到數組,只更新它們。 – Rob

+0

你的意思是如果我**之前用'nil's或任何東西填充**數組,*然後*我將能夠使用下標運算符? – Honey

2

您已寫入返回類型-> Array,但由於數組爲generic,因此您需要指定其包含的內容,例如Array<Something>或等效爲[Something]

表面上看來,您希望返回與輸入相同的「形狀」/陣列類型,因此您可以使用-> [[T]]作爲返回類型。

(我不知道爲什麼編譯器產生的誤差大約..<,但它消失了,如果你解決了第一個問題。)

+0

好了,現在一切都很好,除了對於這一行:'let x = rotateArray(someArray)'產生這個錯誤:'EXC_BAD_INSTRUCTION(code = EXC_1386_INVOP,subcode = 0x0)'並且看到[這裏](http://stackoverflow.com/questions/27759284/about-swift-execution-was-interrupted-reason-exc-bad-instruction-code-exc-13/37624733#37624733)似乎並不解決我的問題,因爲我已經傳遞了正確的參數... – Honey

+0

如果您運行代碼,您會在控制檯輸出中看到'致命錯誤:索引超出範圍'。現在它編譯,你只需要調試你的算法:-) – jtbandes

+0

我不太確定,但它似乎錯誤是我'跳躍'放置一個值爲非0索引的結果。因爲我打印所有的值的指標,我沒有得到任何負面價值。我的第一個索引是[0] [2],在那裏我得到了致命的錯誤。任何想法?你能指導我進入某個方向嗎? – Honey