Swift make方法参数是否可变?

Gab*_*iel 106 syntax immutability mutability swift

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

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

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

ach*_*chi 163

如其他答案中所述,从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'
Run Code Online (Sandbox Code Playgroud)

这在递归中特别有用.

Apple的inout声明指南可以在这里找到.

  • 非常感谢你!!!!我被困在一个递归问题上.你救了我的命. (2认同)
  • 应谨慎使用,因为这会修改函数范围之外的变量.理想情况下,您希望显式返回在函数内更改的值. (2认同)
  • `inout`关键字应该放在参数名和参数类型之间,如下所示:`func reduceToZero(x:inout Int)`在当前的Swift 3版本中. (2认同)

LML*_*LML 44

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

func reduceToZero(var x:Int) -> Int {
    while (x != 0) {
        x = x-1     
    }
    return x
}
Run Code Online (Sandbox Code Playgroud)

  • 方法参数中的var关键字将在Swift 3中弃用. (16认同)
  • /!\使用var将创建参数中传递的变量的副本.因此修改它不会修改原始值.根据https://github.com/apple/swift-evolution/blob/master/proposals/0003-remove-var-parameters-patterns.md,参数中的`var`很可能会在较新的Swift版本中消失. (15认同)
  • 我认为使用Swift 3,我们将无法再这样做了.我们必须创建一个数组的变量副本并返回该修改过的数组. (4认同)
  • 为什么这个答案被投票得像地狱一样?另一个答案放在这个答案之前,并包含比这个更多的信息. (2认同)

GeR*_*yCh 40

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

func reduceToZero(x:Int) -> Int {
    var x = x
    while (x != 0) {
        x = x-1            
    }
    return x
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这有效,也是我所做的,但似乎很尴尬。 (3认同)
  • @Gomfucius 在 Swift 3.1 指南中对此一言不发。在这种情况下(`x` 适合寄存器)几乎没有成本。如果 `x` 是数组、结构体或被改变的对象,那么几乎肯定需要执行复制(除非优化器可以内联分析它并为其取别名)。 (2认同)
  • @wcochran 这是一个巧妙的技巧,但实际上并没有什么特别之处。它只是用本地 var 副本覆盖输入参数。在 OP 的情况下,它是 `var` args 的更好替代品,而不是使用 `inout`,后者可能会产生意想不到的副作用,尤其是。如果 var 是一个指针。 (2认同)

jos*_*shd 12

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

功能:

func foo(array: inout Array<Int>) {
    array.append(1)
}
Run Code Online (Sandbox Code Playgroud)

呼吁功能:

var a = Array<Int>()
foo(array:&a)
Run Code Online (Sandbox Code Playgroud)


DK_*_*DK_ 7

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

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

请参阅Swift书籍"函数"一章中的"常量和变量参数"小节(iBook的第210页,如今).

  • 'var'参数已弃用,将在Swift 3中删除 (5认同)
  • 不适用于 Swift 4 及更新版本。 (2认同)

dhe*_*eru 5

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

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

func manipulateData(a: Int) -> Int {
    var a = a
    // ...
}
Run Code Online (Sandbox Code Playgroud)