swift - 允许 inout 参数使用默认值

标签 swift inout

标题可能有点令人困惑,所以让我向您解释一下。

在 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/

相关文章:

ios - 当单元格在 View 外部时,ClipsToBounds重置

ios - Swift 3.0 中不准确的 DispatchTime.now()

swift - Swift 中 “+=” 运算符的内存安全

swift - 如何保证 inout 参数不会改变 Type 并且不会在函数中变成 nil

swift - 作为 inout 参数的不可变值

swift - 跟踪节点方向

ios - 添加视频背景 View 的最佳做法是什么?

swift - 如何将数组 block 传递给 inout 函数?类型删除?

ios - 如何使用 Dropbox API 重新连接应用程序

swift - 隐式展开的可选值真的是可选值吗?