迅速阵列可选类型和下标(测试版3)迅速阵列可选类型和下标(测试版3)(Swift Array opt

2019-05-12 08:17发布

我下面的2014 WWDC教程408:使用的XCode Beta 3中(30分钟),斯威夫特游乐场。 自从Beta 2的雨燕语法发生了变化。

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

为什么我不能修改这样一个可变的整数数组?

Answer 1:

因为子程序参数隐式地定义与let因此,非易变的。 尝试改变声明:

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

并调用到:

exchange(&date, 0, 2)

您还可以使用var但只允许阵列的子程序中被修改。 对于测试3最大的变化是使阵列真的按值传递,而不是只是一种八九不离十按值传递了一些时间,但不休息。



Answer 2:

@大卫答案是正确的,让我来解释为什么:阵列(以及字典和字符串)是值类型(结构),而不是引用类型。 当值类型必须被传递给函数,创建一个副本,而且功能适用于该副本。

通过使用inout修改,原来的数组传递代替,所以在这种情况下,它可能使它的变化。



文章来源: Swift Array optional Type and subscripting (Beta 3)