2014-07-12 53 views
6

我遵循2014年WWDC教程408:使用XCode Beta 3(30分鐘)的Swift Playgrounds。 Swift語法自Beta 2以來已經發生了變化。Swift數組可選類型和下標(Beta 3)

var data = [27, 46, 96, 79, 56, 85, 45, 34, 2, 57, 29, 66, 99, 65, 66, 40, 40, 58, 87, 64] 

func exchange<T>(data: [T], i: Int, j: Int) { 
    let temp = data[i] 
    data[i] = data[j] // Fails with error '@lvalue $T8' is not identical to 'T' 
    data[j] = temp  // Fails with error '@lvalue $T5' is not identical to 'T' 
} 

exchange(data, 0 , 2) 
data 

爲什麼我不能用這種方式修改可變整數數組?

回答

10

因爲子程序參數隱式定義爲let因此不可變。嘗試改變聲明:

func exchange<T>(inout data: [T], i: Int, j: Int) { 

和調用到:

exchange(&date, 0, 2) 

您還可以使用var但只允許陣列的子程序中被修改。測試版3的重大改變是讓數組真的按照價值傳遞,而不是僅僅在某些時候傳遞值,而不是其他值。

+0

這就解決了,謝謝。 –

2

@大衛的答案是正確的,讓我解釋一下爲什麼:數組(以及字典和字符串)是值類型(結構)而不是引用類型。當值類型必須傳遞給一個函數時,它的一個副本被創建,並且該函數在該副本上工作。

通過使用inout修飾符,原來的數組被傳遞,所以在這種情況下可以對其進行更改。

+0

我有一個問題。例如,我有一個包含數組的對象。我通過UIViewController的屬性傳遞這個對象。我應該怎麼做才能通過它作爲參考? –