如何处理这个错误而不创建额外的变量?
func reduceToZero(x:Int) -> Int { while (x != 0) { x = x-1 // ERROR: cannot assign to 'let' value 'x' } return x }
我不想创建额外的变量只是为了存储 x 的值?
在 Swift 中,只需在函数声明中的变量名前面添加 var关键字:
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 即:
let
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参数的能力。思考: 传递一个指针。
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 // ... }