149

如何在不创建其他变量的情况下处理此错误?

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

我不想创建额外的变量来存储 x 的值。甚至可以做我想做的事吗?

4

7 回答 7

231

如其他答案所述,从 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可在此处找到Apple 的声明指南。

于 2016-05-03T00:43:00.933 回答
52

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

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

如此处所述:'var' 参数已弃用,将在 Swift 3 中删除

于 2016-04-04T10:16:24.770 回答
45

对于 Swift 1 和 2(对于 Swift 3,请参见 achi 使用 inout 参数的回答):let默认情况下,Swift 中函数的参数是,因此var如果您需要更改值,请将其更改为,即,

func reduceToZero(var x:Int) -> Int {
    while (x != 0) {
        x = x-1     
    }
    return x
}
于 2014-06-06T09:04:36.970 回答
17

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

功能:

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

调用函数:

var a = Array<Int>()
foo(array:&a)
于 2016-07-31T06:49:00.447 回答
7

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

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

请参阅 Swift 书的“函数”一章中的“常量和变量参数”小节(iBook 的第 210 页,就像现在一样)。

于 2014-06-06T09:02:27.703 回答
6

在某些情况下我们不需要使用inout

如果您希望更改/范围仅在函数内部,我们可以使用类似的东西:

func manipulateData(a: Int) -> Int {
    var a = a
    // ...
}
于 2019-07-11T15:17:54.337 回答
0

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

func reduceToZeroFP(x:Int) -> Int {
    x == 0 ? x : reduceToZeroFP(x: x - 1)
}
于 2018-09-10T23:33:32.857 回答