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 会自动克隆参数吗?的主要内容,如果未能解决你的问题,请参考以下文章