通过引用传递常量参数

Pass constant parameter by reference

如何通过引用传递常量参数?

在 Swift 中,它可以只对变量完成(并使用 inout 关键字)。

我可以通过引用传递常量吗?

我想做这样的事情:

let x = ["a":1, "b":2]
myFunc(&x)

您不能将 let 常量传递给 inout 参数。

根据Swift reference

In-out parameters are passed as follows:

  • When the function is called, the value of the argument is copied.
  • In the body of the function, the copy is modified.
  • When the function returns, the copy’s value is assigned to the original argument.

这会自动取消 let 常量的资格,因为它们无法重新赋值。

Can I pass a constant by reference?

我不知道。但是,您 永远 不需要自己这样做。

在您使用 Dictionary 提出的特定情况下,您处理的是一个 间接 存储其内容的集合。在最简单的层面上,您可以将其视为只有一个 属性 的结构,它只是对字典的键和值的实际存储的引用。

按值传递该结构(字典)等同于仅传递一个引用。多个字典可以通过该引用查看相同的键值存储。但是,如有必要,将采用存储的唯一副​​本进行突变——这称为写时复制,并允许值语义,而无需在每次复制字典结构时复制整个缓冲区的开销。

因此,完全没有必要在这里传递引用。只需正常传递字典(即按值 - 也就是说,不使用 &,例如 inout 和指针参数)。

在更一般的情况下,您希望在按值传递给函数时避免复制大型结构 – 编译器已经涵盖了您。它可以执行各种巧妙的优化以减少复制;其中之一是通过引用函数传递结构。我将对此进行更详细的介绍

这真的不是你应该考虑的事情,除非:

  • 您实际上需要调用方突变(在这种情况下,无论如何您都需要 var)。

  • 您明确指出了一个性能瓶颈(在这种情况下,您可能会受益于制作自己的写时复制结构)。