标题可能有点令人困惑,所以让我向您解释一下。
在 Swift 中,我们可以使用具有默认参数值的函数,例如:
func foo(value: Int = 32) { }
我们还可以有输入输出参数,例如
func foo(value: inout Int) { }
但是,有没有办法两者兼得呢?一个 inout 参数,如果没有传递,我们可以创建吗?这对于递归函数特别有用,我正在尝试解决这个问题。
最佳答案
默认参数大多只是重载的方便简写。当您想要超越基础知识时,您只需手动构建重载,这允许您实现所需的任何复杂程度:
// The base-case version
func foo() {
var value = 0
foo(value: &value)
}
func foo(value: inout Int) { }
顺便说一句,在 Swift 中使用递归时要非常小心。没有尾部调用优化,因此如果递归很深,您可能会炸毁堆栈。缺乏优雅的模式匹配使得递归代码变得不那么优雅,并且通过 inout
传递值会让优化器变得更加困难。在大多数情况下,您需要一个循环(或将循环隐藏在高阶非递归函数(如 map
)中)。
另外,不要忘记嵌套函数,这对于隐藏累加器样式参数很有帮助。
func foo() {
var value = 0
func f() {
// operate on value and recurse
// no need for inout; and doesn't leak the implementation detail
}
f()
}
关于swift - 允许 inout 参数使用默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66164083/