Swift Array可选类型和下标(Beta 3)

时间:2014-07-12 06:13:45

标签: arrays swift xcode6

我跟随2014年WWDC教程408:使用XCode Beta 3的Swift Playgrounds(30分钟)。自Beta 2以来,Swift语法已经发生了变化。

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

为什么我不能以这种方式修改可变整数数组?

2 个答案:

答案 0 :(得分:10)

因为子程序参数是用let隐式定义的,因此不可变。尝试将声明更改为:

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

并调用:

exchange(&date, 0, 2)

您也可以使用var,但这只允许在子程序中修改数组。 beta 3的最大变化是让数组真正按值传递,而不是在某些时候通过值传递,而不是其余的。

答案 1 :(得分:2)

@David答案是正确的,让我解释一下原因:数组(以及字典和字符串)是值类型(结构)而不是引用类型。当必须将值类型传递给函数时,会创建它的副本,并且该函数对该副本起作用。

通过使用inout修饰符,会传递原始数组,因此在这种情况下可以对其进行更改。