我们如何改变功能参数?

Moh*_*hwa 21 swift

在Swift中我们可以在函数中改变函数的局部参数值吗?

喜欢:

func exampleFunction(value: String, index: Int) -> Bool {
    value = "Changed Value" // Error
    index = 3  // Error

    return true
}
Run Code Online (Sandbox Code Playgroud)

在viewDidLoad()中调用函数:

var flag = exampleFunction("Passed Value", 2)
Run Code Online (Sandbox Code Playgroud)

这是否可以在exampleFunction范围中更改值和索引?如果不是有任何其他方式这样做?因为使用这个我们只改变temp的值.

var temp = value
temp = "temp Change"
Run Code Online (Sandbox Code Playgroud)

Cez*_*zar 55

从您的示例中可以看出,您需要将函数内部传递的参数更改为副作用,并且需要在函数调用之后使用更新的值.如果是这种情况,则需要使用inout修饰符.

否则,如果您只需要修改函数调用中的参数,则可以在函数定义中将它们显式定义为变量:

使用输入输出参数

首先,将您的函数声明更改为:

func exampleFunction(inout value: String, index: inout Int) -> Bool
Run Code Online (Sandbox Code Playgroud)

现在,输入输出参数具有传递给函数的值,由函数修改,然后传回函数,替换原始值.为此,您无法将文字传递到函数中,因为之后无处可存储修改后的值.事实上,它必须是一个变量.您不能传递常量或文字值作为参数,因为不能修改常量.因此,将函数调用更改为:

var passed = "passedValue"
var index = 2

var b = exampleFunction(&passed, &index)
Run Code Online (Sandbox Code Playgroud)

通话结束后,无论是passed和index将包含新的值,通过功能改进.

另外,&在调用函数时请注意每个参数之前的内容.它必须在那里,表明该参数可以被函数修改.

使用变量参数 - 在Swift 3中删除

在这种情况下,您需要做的就是更改函数声明以使用变量参数,如下所示:

func exampleFunction(var value: String, var index: Int) -> Bool
Run Code Online (Sandbox Code Playgroud)

对函数范围内的参数所做的更改在函数外部不可见,或者在函数调用后的任何位置存储.

  • 我不得不使用`value:inout String`更改了sytax?值得更新这个答案还是创建一个新答案? (2认同)

Nic*_*lai 10

如果它仅用于函数范围,则可以将函数声明为

func exampleFunction(var value : String, var index : Int) -> Bool { }
Run Code Online (Sandbox Code Playgroud)

注意 - 但是在Swift3中删除了.

只需添加一个变量..

func exampleFunction(value : String, index : Int) -> Bool {
      var value = value
      var index = index
Run Code Online (Sandbox Code Playgroud)

实际上,Xcode IDE会为您自动修复.


如果您打算在其全局上下文中修改参数,则可以使用inout.


Moh*_*diq 5

var 参数已弃用,将从 Swift 3.0 中删除。如果要更改函数体内的参数,则应将传递的参数存储在某个局部变量中并更改它

    func exampleFunction(var value: String, var index: Int) -> Bool {
       var index = index
       ...
    }
Run Code Online (Sandbox Code Playgroud)

inout 参数仍然存在。因此,如果您希望对传递的参数所做的更改反映在函数体之外,则应该使用 inout 参数。