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

Why can't we pass const values by reference to inout functions in swift?

提问人:Sourav Kannantha B 提问时间:2/9/2021 更新时间:2/9/2021 访问量:375

问:

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

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

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

SWIFT 按值传递

评论

1赞 Sandeep Bhandari 2/9/2021
这是一个非常敏锐的观察,+1 的问题,但是如果我可以在你使用 inout 时把我的两美分放进去,你使用的是按引用传递而不是按值传递,因此你有一个名为 a 的变量/常量的内存地址(目前持有值 5)现在你有一个原始地址, 没有什么能阻止您修改它所包含的值。您可以简单地将其更改为 Int.min 到 Int.max 范围内的任何值,如果 swift 允许传入让出,有人可能会假设 a 的值永远不会改变,但有人可能会在后台更改其值,从而迫使您inout
0赞 Sandeep Bhandari 2/9/2021
使用代替 A 类是有道理的,并且也保持了非常明确的意图varlet
0赞 rana5ohaib 2/9/2021
在 swift 中,inout 功能不会发送对函数的引用,它仍然按值传递,请阅读>>docs.swift.org/swift-book/LanguageGuide/Functions.html
0赞 vadian 2/9/2021
在实践中,一个不会被修改的值类型参数(去但不去)是没有意义的。inoutinout
0赞 Sandeep Bhandari 2/9/2021
@rana5ohaib:根据文档作为优化,当参数是存储在内存中物理地址的值时,函数体内部和外部都使用相同的内存位置。优化的行为称为引用调用;链接 docs.swift.org/swift-book/ReferenceManual/...

答:

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
这是我问题的实际答案。请编辑您的原始答案以包含这一点。