提问人:Sourav Kannantha B 提问时间:2/9/2021 更新时间:2/9/2021 访问量:375
为什么我们不能在 swift 中通过引用 inout 函数来传递 const 值?
Why can't we pass const values by reference to inout functions in swift?
问:
在 C 中,虽然我们将一个值声明为 ,但我们可以传递给一个声明为 的函数。const int a = 5;
&a
void someFun(const int *);
根据经验,在 C 语言中,当不需要更改原始值时,i) 如果对象的大小小于或等于指针的大小,则我们按值传递它,ii) 否则我们通过常量引用传递它 将整个值复制到函数会占用更多资源。
但是在 swift 中,即使函数中没有修改 inout 参数,我们也不能将声明为 的值传递给声明为 的函数。因此,我们必须在函数中将 z 标记为 let。这会将整个值复制到函数中。如果 a 类型的大小很大,这可能会花费更多。有解决方法吗?let a = 5
someFun(_ z: inout Int) -> ()
答:
0赞
rana5ohaib
2/9/2021
#1
至于我的理解,
swift 中的“inout”实际上并没有发送 函数的属性。当您更改 属性作为“inout”传递,swift 会自行检查您是否 更改了值,然后对实际值执行该更改 财产本身。因此,“inout”在 swift 中唯一能做的就是 更改实际属性的值。因此,即使它允许您发送一个常量作为 “inout”,你仍然无法使用它,因为“常量”的本质。你只是不能改变“常量”的值,因为它是不可变的。
参考链接: https://docs.swift.org/swift-book/LanguageGuide/Functions.html
编辑: 正如 @SouravKannanthaB 在上面的评论中提到的,swift 可以通过模仿引用传递的行为来自动优化输入,但我不相信有人可以强制进行优化。
评论
0赞
Sourav Kannantha B
2/9/2021
哦。。。。然后,每次都会复制值并将其传递给函数。如果值结构很大,那么复制它岂不是会变得更加繁琐?
1赞
rana5ohaib
2/9/2021
正如 @SouravKannanthaB 在上面的评论中提到的,swift 可以通过模仿行为来自动优化输入,但我不相信有人可以强制进行优化。
0赞
Sourav Kannantha B
2/9/2021
这是我问题的实际答案。请编辑您的原始答案以包含这一点。
评论
inout
var
let
inout
in
out