Parameters Swift是否自动克隆参数?

Parameters Swift是否自动克隆参数?,parameters,swift,arguments,pass-by-reference,pass-by-value,Parameters,Swift,Arguments,Pass By Reference,Pass By Value,我一直在读苹果在Swift上发布的iBook,目前正在阅读有关功能的文章。在本章中,他们将讨论inout关键字。这让我想知道:当参数作为参数传递到函数中时,swift会自动克隆参数吗?如果不是,我是否可以创建一个常量,该常量等于我要传递到函数中的变量,然后传递该常量以避免在我不想的情况下对变量进行变异?(顺便说一下,我知道整数是不可变的。我只是用整数来保持简单。) (如果这是一个显而易见的答案,那么很抱歉。我几乎没有编程经验。)感谢您的帮助。默认情况下,值类型变量不仅按值传递给方法和函数,而且按

我一直在读苹果在Swift上发布的iBook,目前正在阅读有关功能的文章。在本章中,他们将讨论inout关键字。这让我想知道:当参数作为参数传递到函数中时,swift会自动克隆参数吗?如果不是,我是否可以创建一个常量,该常量等于我要传递到函数中的变量,然后传递该常量以避免在我不想的情况下对变量进行变异?(顺便说一下,我知道整数是不可变的。我只是用整数来保持简单。)


(如果这是一个显而易见的答案,那么很抱歉。我几乎没有编程经验。)感谢您的帮助。

默认情况下,值类型变量不仅按值传递给方法和函数,而且按值作为常量传递给方法和函数

也就是说,函数不仅不能改变函数外部变量的值,甚至不能改变函数内部变量的值

为了让函数修改函数内部的值,函数必须将参数声明为
var
参数。这样做允许函数修改函数内部的变量,但是这仍然不会影响函数外部的变量

只有指定了
inout
时,函数才能在函数外部修改变量。在本例中,我们通过引用传递了变量

有关此主题的更多阅读。如果你向下滚动大约三分之二的路径,你会发现一个叫做“常量和变量参数”的部分,以及紧跟其后的另一个叫做“输入输出参数”的部分


您不必担心知道函数何时修改或不修改您的变量。这很容易知道。当一个函数将一个参数声明为inout参数时,您需要在函数调用中使用带有该参数的“address of”操作符

这是文档中的示例函数:

func swapTwoInts(inout a: Int, inout b: Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}
现在,给出以下两个整数:

var someInt = 3
var anotherInt = 107
我们不能这样调用上述函数:

swapTwoInts(someInt, anotherInt)
编译器会抱怨:

将“Int”类型的值传递给inout参数需要显式“&”

要解决编译器投诉,我们必须使用操作员的地址:

swapTwoInts(&someInt, &anotherInt)

现在编译器很高兴,
&
,操作符的地址,对我们来说是一个大红旗,我们已经通过引用传递了变量,函数可以修改它们的值。

在Swift语言中,
inout
参数前面的符号(
&
)不是“操作符的地址”. 它只是一个符号,出于语法原因需要它。但当然,生成的代码实际上需要提供的参数的地址。如果我使用的是我创建的引用类型的类,如果我将它们作为参数传递,我如何克隆它们?如果你想按值传递类,你很可能需要使用
结构
。但对于类,不能按值传递它。你能做的最好的事情就是复制一个类并通过引用传递副本。正如nhgrif在一个非常好的答案中提到的,这里的关键概念是“通过引用传递”与“通过值传递”(你的“克隆”)。只要知道这些是标准短语,你就可以在Swift中找到关于问题主题的大量信息。我还编辑了问题标签,包括“通过引用传递”和“通过值传递”标签,因此,只要点击其中一个标签,就可以很好地阅读这个主题。
swapTwoInts(&someInt, &anotherInt)