1

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

根据经验,在 C 语言中,当不需要更改原始值时,i) 如果对象的大小小于或等于指针的大小,则按值传递,ii) 否则按将整个值复制到函数的 const 引用会占用更多资源。

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

4

1 回答 1

0

就我的理解而言,

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

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

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

于 2021-02-09T07:25:21.187 回答