通过引用传递常量参数

时间:2017-11-05 13:13:12

标签: swift constants pass-by-reference

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

在Swift中,它只能用于变量(并使用inout关键字)。

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

我想做这样的事情:

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

2 个答案:

答案 0 :(得分:2)

您无法将let常量传递给inout参数。

根据Swift reference

  

输入输出参数传递如下:

     
      
  • 调用该函数时,将复制参数的值。
  •   
  • 在功能正文中,副本被修改。
  •   
  • 当函数返回时,副本的值将分配给原始参数。
  •   

这会自动取消let个常量,因为它们无法返回。

答案 1 :(得分:2)

  

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

不是我意识到的。但是,您永远不应该自己需要这样做。

在您使用Dictionary加注的特定情况下,您正在处理存储其内容间接的集合。在最简单的层面上,您可以将其视为仅具有单个属性的结构,这仅仅是对密钥和实际存储的引用。字典的价值。

通过值传递该结构,字典等同于仅传递引用。多个词典可以查看相同的键和键。通过该引用来存储值。但是,如果需要,将在变异时使用唯一的存储副本 - 这称为写时复制,并允许值语义,而不会在每次复制字典结构时复制整个缓冲区的开销。

因此,这里绝对不需要传递引用。只需正常传递字典(即按值 - 即不使用&,例如使用inout和指针参数。

在更常见的情况下,在将值传递给函数时,要避免复制的大型结构 - 编译器已经覆盖了您。它可以执行各种巧妙的优化以减少复制;其中一个是通过引用函数传递结构。我会详细介绍这个in this Q&A

除非:

,否则你不应该考虑这个问题
  • 您实际上需要来电方变异(在这种情况下,您还需要var)。

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