如何通过引用传递常量参数?
在Swift中,它只能用于变量(并使用inout
关键字)。
我可以通过引用传递常量吗?
我想做这样的事情:
let x = ["a":1, "b":2]
myFunc(&x)
答案 0 :(得分:2)
您无法将let
常量传递给inout
参数。
输入输出参数传递如下:
- 调用该函数时,将复制参数的值。
- 在功能正文中,副本被修改。
- 当函数返回时,副本的值将分配给原始参数。
这会自动取消let
个常量,因为它们无法返回。
答案 1 :(得分:2)
我可以通过引用传递常量吗?
不是我意识到的。但是,您永远不应该自己需要这样做。
在您使用Dictionary
加注的特定情况下,您正在处理存储其内容间接的集合。在最简单的层面上,您可以将其视为仅具有单个属性的结构,这仅仅是对密钥和实际存储的引用。字典的价值。
通过值传递该结构,字典等同于仅传递引用。多个词典可以查看相同的键和键。通过该引用来存储值。但是,如果需要,将在变异时使用唯一的存储副本 - 这称为写时复制,并允许值语义,而不会在每次复制字典结构时复制整个缓冲区的开销。
因此,这里绝对不需要传递引用。只需正常传递字典(即按值 - 即不使用&
,例如使用inout
和指针参数。
在更常见的情况下,在将值传递给函数时,要避免复制的大型结构 - 编译器已经覆盖了您。它可以执行各种巧妙的优化以减少复制;其中一个是通过引用函数传递结构。我会详细介绍这个in this Q&A。
除非:
,否则你不应该考虑这个问题您实际上需要来电方变异(在这种情况下,您还需要var
)。
您已经明确指出了性能瓶颈(在这种情况下,您可能会从制作自己的写时复制结构中受益)。