Swift使方法参数可变?

我怎样才能处理这个错误,而不创build额外的variables?

func reduceToZero(x:Int) -> Int { while (x != 0) { x = x-1 // ERROR: cannot assign to 'let' value 'x' } return x } 

我不想创build额外的variables来存储x的值。 是否有可能做我想要的?

正如其他答案中所述,从Swift 3开始,在variables被放弃之前放置var。 虽然在其他答案中没有说明是声明一个inout参数的能力。 想想:传递一个指针。

 func reduceToZero(x: inout Int) { while (x != 0) { x = x-1 } } var a = 3 reduceToZero(&a) print(a) // will print '0' 

这在recursion中可能特别有用。

可以在这里find一个简单的解释。

对于Swift 1和Swift 3(对于Swift 3,请参阅achi使用inout参数的答案):Swift中的函数参数默认为let ,如果需要更改值,则将其更改为var

 func reduceToZero(var x:Int) -> Int { while (x != 0) { x = x-1 } return x } 

'var'参数被弃用,并将在Swift 3中被删除。因此,分配一个新的参数似乎是现在最好的方法:

 func reduceToZero(x:Int) -> Int { var x = x while (x != 0) { x = x-1 } return x } 

正如这里提到的: 'var'参数已被弃用,并将在Swift 3中被删除

Swift3的答案是传递可变数组指针。

function:

 func foo(array: inout Array<Int>) { array.append(1) } 

调用函数:

 var a = Array<Int>() foo(array:&a) 

在Swift中,你只需要在函数声明中的variables名前添加var关键字:

 func reduceToZero(var x:Int) -> Int { // notice the "var" keyword while (x != 0) { x = x-1 } return x } 

请参阅Swift手册( function)一章中的“常量和variables参数”小节(与iBook相同)。