为什么我们不能在 swift 中通过引用 inout 函数来传递 const 值?

问题描述

在 C 中,虽然我们将值声明为 const int a = 5;,但我们可以将 &a 传递给声明为 void someFun(const int *);函数

作为一个rule of thumb,在C中,当不需要改变原值时,i)如果对象的大小小于或等于指针的大小,我们按值传递,ii)否则我们通过 const 引用传递它,将整个值复制到函数会占用更多资源。

但是在 swift 中,即使函数中没有修改 inout 参数,我们也无法将声明为 let a = 5 的值传递给声明为 someFun(_ z: inout Int) -> ()函数。因此我们必须在函数中将 z 标记为 let。这会将整个值复制到函数中。如果 a 类型的大小很大,这可能会花费更多。有解决方法吗?

解决方法

根据我的理解,

swift 中的“inout”实际上并没有发送引用 函数的属性。当您更改值时 属性作为 'inout' 传递,swift 本身会检查您是否 更改了值,然后将该更改执行到实际 自己的财产。所以 'inout' 在 swift 中唯一能做的就是 改变实际财产的价值。所以即使它允许你发送一个常量作为 'inout',您仍然无法使用它,因为 '常量' 的本质。您无法更改“常量”的值,因为它是不可变的。

参考链接: https://docs.swift.org/swift-book/LanguageGuide/Functions.html

编辑: 正如@SouravKannanthaB 在上面的评论中提到的,swift 可以通过模仿通过引用传递的行为来自动优化 inout,但我不相信有人可以强制进行优化。