Swift make方法参数是否可变?

时间:2014-06-06 08:57:05

标签: swift syntax immutability mutability

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

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

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

7 个答案:

答案 0 :(得分:149)

如其他答案中所述,从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'

这在递归时特别有用。

可以找到Apple的inout声明指南here

答案 1 :(得分:44)

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

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

答案 2 :(得分:35)

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

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

如此处所述:'var' parameters are deprecated and will be removed in Swift 3

答案 3 :(得分:12)

Swift3回答传递可变数组指针。

功能:

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

致电功能:

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

答案 4 :(得分:7)

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

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

参见第34节“常数和变量参数&#34;在Swift书的"Functions" chapter中(今天iBook的第210页)。

答案 5 :(得分:0)

使用Swift3进行函数式编程的解决方案...

func reduceToZeroFP(x:Int) -> Int {
    while (x > 0) {
        return reduceToZeroFP(x: x-1)
    }
    return x
}

答案 6 :(得分:0)

在某些情况下,我们不想使用inout

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

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