快速使方法参数可变? ?

如何处理这个错误而不创建额外的变量?

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

我不想创建额外的变量只是为了存储 x 的值?

75803 次浏览

在 Swift 中,只需在函数声明中的变量名前面添加 var关键字:

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

请参阅 Swift 图书的 “功能”一章中的“常量和变量参数”一节(iBook 的第210页)。

对于 Swift 1和2(对于 Swift 3,请参见使用 inout 参数以 achi 表示的答案) : 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中删除

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

func reduceToZero(_ x: inout Int) {
while (x != 0) {
x = x-1
}
}


var a = 3
reduceToZero(&a)
print(a) // will print '0'

这在递归中特别有用。

苹果的 inout声明准则可以找到 给你

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

功能:

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

运作召唤:

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

使用函数式编程的 Swift5解决方案..。

func reduceToZeroFP(x:Int) -> Int {
x == 0 ? x : reduceToZeroFP(x: x - 1)
}

有些情况下,我们不需要使用 inout

如果您希望更改/作用域只在函数内部,我们可以使用类似下面的代码:

func manipulateData(a: Int) -> Int {
var a = a
// ...
}