【问题标题】:Cannot assign to a parameter无法分配给参数
【发布时间】:2014-08-03 15:05:27
【问题描述】:

我已经声明了一个函数

func someFunction(parameterName: Int) {
    parameterName = 2  //Cannot assign to let value parameter Name
    var a = parameterName
}

并尝试在运行时为其分配一个值,但它给了我错误 “无法分配给让值参数名称”。

参数名是默认不变的吗?可以改成变量吗?

【问题讨论】:

  • 为了减少麻烦,您可以在函数顶部添加var paramterName = parameterName 行。声明隐藏了参数,这会将paramaterName 变成var

标签: ios swift ios8


【解决方案1】:

[在 Swift >= 3.0] 函数参数如同由 let 定义,因此是常量。如果您打算修改参数,则需要一个局部变量。因此:

func someFunction (parameterName:Int) {
  var localParameterName = parameterName
  // Now use localParameterName
  localParameterName = 2;
  var a = localParameterName;
}

[在 Swift 用var 声明参数,如下所示:

func someFunction(var parameterName:Int) {
  parameterName = 2;
  var a = parameterName;
}

inout 的使用具有不同的语义。

[注意“变量参数”将在未来的 Swift 版本中消失。]这是关于 “变量参数”的 Swift 文档

函数参数默认为常量。试图改变 函数体内的函数参数值 导致编译时错误。这意味着您无法更改 错误的参数值。

但是,有时函数具有参数值的可变副本以供使用是有用的。您可以避免定义一个 通过指定一个或多个在函数中自己创建新变量 参数改为可变参数。可变参数是 可用作变量而不是常量,并给出一个新的 参数值的可修改副本,以使您的函数正常工作 与。

通过在参数名称前加上关键字var来定义可变参数:..."

摘自:Apple Inc.“Swift 编程语言”。

如果您确实想更改存储在传递给函数的位置中的值,那么正如@conner 所指出的,inout 参数是合理的。这是 [In Swift >= 3.0] 的示例:

  1> var aValue : Int = 1
aValue: Int = 1
  2> func doubleIntoRef (place: inout Int) { place = 2 * place }
  3> doubleIntoRef (&aValue)
  4> aValue
$R0: Int = 2
  5> doubleIntoRef (&aValue) 
  6> aValue 
$R1: Int = 4

【讨论】:

    【解决方案2】:

    为了修改传入的参数,你必须将它指定为一个inout参数:

    func someFunction(inout parameterName:Int)
    {
        parameterName = 2;
        var a = parameterName;
    }
    

    请注意,这也会更改传入的变量。如果这不是您要查找的内容,请按照 GoZoner 的建议使用 var。

    【讨论】:

    • 不清楚 OP 想要的是 inout 参数还是 var 参数。在许多按值传递的语言中,可以在方法/函数中更改值或参数变量。
    • 不,这会产生副作用,即传入的任何变量都会被修改,这可能不是 OP 想要的。
    猜你喜欢
    • 2019-03-11
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    相关资源
    最近更新 更多