【问题标题】:Add default value to inout parameter using Swfit使用 Swift 为输入参数添加默认值
【发布时间】:2017-01-07 19:22:33
【问题描述】:

在 Swift 2 中,可以执行以下操作:

class SomeType {
    static let singletonInstance = SomeType()

    func someFunction(var mutableParameter: SomeType = SomeType.singletonInstance) {
        ...
    }
}

但是在 Swift 3 中,函数参数的 var 关键字将被删除,取而代之的是 inout。我无法使用inout 关键字获得与上述相同的结果。

class SomeType {
        static let singletonInstance = SomeType()

        func someFunction(inout mutableParameter: SomeType = SomeType.singletonInstance) {
            ...
        }
    }

相反,我收到“无法将类型 'SomeType' 的默认参数值转换为类型 'inout SomeType'”的错误

我的问题是是否可以使用 inout 的默认值?

【问题讨论】:

标签: swift function default-value swift3 inout


【解决方案1】:

您可以创建第二个函数签名来“模拟”默认值

func foo() {
    var v: Int = 0 // your default value
    foo(bar: &v)
}

func foo(bar: inout Int) {
    // do stuff
}

【讨论】:

    【解决方案2】:

    任何需要默认inout 参数的人都可以考虑这样的解决方案:

    class SomeType {
        static let singletonInstance = SomeType()
    
        func someFunction(inout mutableParameter: SomeType) {
            ...
        }
    
        // Declare function without 'mutableParameter':
        func someFunction() {
            someFunction(SomeType.singletonInstance)
        }
    }
    

    当您指定参数的默认值时,Swift 编译器会自动为您生成一个不带参数的函数。在这个解决方案中,我们手动完成。

    【讨论】:

      【解决方案3】:

      您所说的两个关键字inoutvar 非常不同。

      来自Apple Documentation

      In-out参数传递如下:

      1. 调用函数时,会复制参数的值。
      2. 在函数体中,修改了副本。
      3. 当函数返回时,副本的值被分配给原始参数。

      因此,您不能为 inout 参数指定默认值,因为这会使 inout 属性完全无用。

      你可以做的是接收一个普通的(常量)参数带有一个默认值,并以这种方式声明一个具有相同名称的新var(代码来自Swift Evolution's Removing var from Function Parameters Proposal,带有添加默认参数):

      func foo(i: Int = 5) {
          var i = i
          // now you can change i as you'd like
      }
      

      【讨论】:

      猜你喜欢
      • 2023-03-20
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 2012-08-01
      • 2016-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多