Swift 会自动克隆参数吗?

Does Swift Automatically Clone Arguments?

提问人:liam923 提问时间:8/12/2014 最后编辑:nhgrifliam923 更新时间:8/12/2014 访问量:897

问:

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

var variable: Int = 5
let constant = variable
let returnVale = function(constant)

(对不起,如果这是一个显而易见的答案。我几乎没有编程经验。感谢您的帮助。

swift 参数 按引用 值传递

评论

0赞 Matt Gibson 8/12/2014
正如 nhgrif 在非常好的回答中提到的,这里的关键概念是“按引用传递”与“按值传递”(您的“克隆”)。只要知道这些是标准短语,就应该可以让你在 Swift 中找到关于你的问题主题的大量信息。
0赞 nhgrif 8/12/2014
我还编辑了问题标签以包含“按引用传递”和“按值传递”标签,因此只需单击其中一个标签,就可以对该主题进行一些很好的 StackOverflow 阅读。

答:

8赞 nhgrif 8/12/2014 #1

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

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

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

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

有关此主题的更多阅读,请参阅官方文档的链接。如果你向下滚动大约三分之二,你会发现一个名为“常量和可变参数”的部分,紧接着还有另一个部分,叫做“In-Out Parameters”。


您不必担心知道函数何时会或不会修改您的变量。这很容易知道。当函数将参数声明为参数时,您需要在函数调用中使用该参数的“地址”运算符。inout

这是文档中的示例函数:

func swapTwoInts(inout a: Int, inout b: Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}

现在,给定以下两个 Int:

var someInt = 3
var anotherInt = 107

我们不能这样称呼上面的函数:

swapTwoInts(someInt, anotherInt)

编译器会抱怨:

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

为了解决编译器的抱怨,我们必须使用 address-of 运算符:

swapTwoInts(&someInt, &anotherInt)

现在编译器很高兴,而 address-of 运算符对我们来说是一个很大的危险信号,表明我们已经通过引用传递了我们的变量,并且该函数可以修改它们的值。&

评论

3赞 CouchDeveloper 8/12/2014
在 Swift 语言中,放在参数参数前面的 & 符号 () 不是“地址运算符”。它只是一个 & 符号,出于语法原因,这是必需的。但是,当然,生成的代码实际上需要所提供参数的地址。&inout
0赞 liam923 8/21/2014
如果我使用的是我创建的类,它们是引用类型,如果我将它们作为参数传递,我该如何克隆它们?
0赞 nhgrif 8/21/2014
如果要按值传递类,则很可能需要使用 .但是对于一个类,你不能按值传递它。你能做的最好的事情是制作一个类的副本,并通过引用传递副本。struct