如何在不创建其他变量的情况下处理此错误?
func reduceToZero(x:Int) -> Int {
while (x != 0) {
x = x-1 // ERROR: cannot assign to 'let' value 'x'
}
return x
}
我不想创建额外的变量来存储x的值。甚至可以做我想做的事情吗?
答案 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
// ...
}