如何在不创建额外变量的情况下解决这个错误?
func reduceToZero(x:Int) -> Int {
while (x != 0) {
x = x-1 // ERROR: cannot assign to 'let' value 'x'
}
return x
}
我不想创建额外的变量来存储 x 的值。我想知道是否有可能做到我想要的。
如何在不创建额外变量的情况下解决这个错误?
func reduceToZero(x:Int) -> Int {
while (x != 0) {
x = x-1 // ERROR: cannot assign to 'let' value 'x'
}
return x
}
我不想创建额外的变量来存储 x 的值。我想知道是否有可能做到我想要的。
如其他答案所述,自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
声明指南可以在这里找到。
inout
关键字放置在参数名称和参数类型之间,就像这样:func reduceToZero(x: inout Int)
。 - Agustí Sánchezvar
关键字的合适替代方法。你应该使用一个变量来遮蔽原始(常量)参数:var x = x
应该是函数的第一行。 - BallpointBen'var'参数已被弃用,并将在Swift 3中移除。 因此,现在似乎分配给一个新参数是最好的方法:
func reduceToZero(x:Int) -> Int {
var x = x
while (x != 0) {
x = x-1
}
return x
}
x
到新的 var x
中吗?还是 Swift 做了更有效率的事情? - Genkix
适合于寄存器),几乎没有成本。如果 x
是数组、结构体或被修改的对象,则几乎肯定需要执行复制(除非优化器可以内联分析并重命名它)。 - wcochraninout
更好地替代了 var
args,因为后者可能会产生意想不到的副作用,尤其是当变量是指针时。 - Echelon对于Swift 1和2(有关Swift 3,请参见achi的答案,使用一个inout参数):在Swift中,函数的参数默认为 let
,因此如果需要修改该值,请将其更改为var
。
func reduceToZero(var x:Int) -> Int {
while (x != 0) {
x = x-1
}
return x
}
传递可变数组指针的 Swift 3 解决方案。
函数:
func foo(array: inout Array<Int>) {
array.append(1)
}
函数调用:
var a = Array<Int>()
foo(array:&a)
var
关键字即可:func reduceToZero(var x:Int) -> Int { // notice the "var" keyword
while (x != 0) {
x = x-1
}
return x
}
有些情况下,我们不需要使用 inout
。
如果你希望更改/作用域仅限于函数内部,可以采用以下方法:
func manipulateData(a: Int) -> Int {
var a = a
// ...
}
使用Swift5和函数式编程的解决方案...
func reduceToZeroFP(x:Int) -> Int {
x == 0 ? x : reduceToZeroFP(x: x - 1)
}