Swift 会自动克隆参数吗?

Posted

技术标签:

【中文标题】Swift 会自动克隆参数吗?【英文标题】:Does Swift Automatically Clone Arguments? 【发布时间】:2014-10-04 23:27:50 【问题描述】:

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

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

(对不起,如果这是一个显而易见的答案。我的编程经验很少。)谢谢您的帮助。

【问题讨论】:

正如 nhgrif 在非常好的回答中提到的,这里的关键概念是“通过引用”与“通过值”(您的“克隆”)。只要知道这些是标准短语,您就可以在 Swift 中找到关于您的问题主题的大量信息。 我还编辑了问题标签以包括“按引用传递”和“按值传递”标签,因此只需单击其中一个,就可能有一些关于该主题的不错的 *** 阅读这些标签。 【参考方案1】:

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

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

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

只有在指定inout时,函数才能在函数外修改变量。在这种情况下,我们通过引用传递了变量。

有关此主题的更多信息,here's a link to the official documentation。如果您向下滚动大约三分之二,您会发现一个名为“常量和可变参数”的部分,以及紧随其后的另一个部分,称为“输入输出参数”。


您不必担心知道函数何时会或不会修改您的变量。这很容易知道。当函数将参数声明为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 参数需要显式“&”

要修复编译器问题,我们必须使用地址运算符:

swapTwoInts(&someInt, &anotherInt)

现在编译器很高兴,&,地址运算符,对我们来说是一个很大的危险信号,我们通过引用传递了变量,函数可以修改它们的值。

【讨论】:

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

以上是关于Swift 会自动克隆参数吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 Swift 中使用运算符作为默认函数参数吗?

使用枚举参数自动生成的 Swift 扩展函数

Swift:我可以将 UIView 作为我可以创建/修改的参数传递吗?

你能利用 Swift 的默认结构初始化器来简化参数传递吗?

测试克隆模拟参数的方法

Swift 中缺少参数错误的参数