2

标题可能有点混乱,所以让我打破这个给你。

在 Swift 中,我们可以使用具有默认参数值的函数,例如:

func foo(value: Int = 32) { }

我们也可以有 In-Out 参数,例如

func foo(value: inout Int) { }

但是,有办法两者兼得吗?一个 inout 参数,如果它没有被传递,我们可以创建?这对于递归函数特别有用,我正在尝试解决这个问题。

4

1 回答 1

2

默认参数大多只是重载的一种方便的简写。当您想超越基础知识时,您只需手动构建重载,它允许您实现任何级别的复杂性:

// 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()
}
于 2021-02-11T22:58:00.037 回答