我跟随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
为什么我不能以这种方式修改可变整数数组?
答案 0 :(得分:10)
因为子程序参数是用let
隐式定义的,因此不可变。尝试将声明更改为:
func exchange<T>(inout data: [T], i: Int, j: Int) {
并调用:
exchange(&date, 0, 2)
您也可以使用var
,但这只允许在子程序中修改数组。 beta 3的最大变化是让数组真正按值传递,而不是在某些时候通过值传递,而不是其余的。
答案 1 :(得分:2)
@David答案是正确的,让我解释一下原因:数组(以及字典和字符串)是值类型(结构)而不是引用类型。当必须将值类型传递给函数时,会创建它的副本,并且该函数对该副本起作用。
通过使用inout
修饰符,会传递原始数组,因此在这种情况下可以对其进行更改。