5

在 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默认值?

4

3 回答 3

6

您正在谈论的两个关键字inoutvar是非常不同的。

来自苹果文档

In-out参数传递如下:

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

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

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

func foo(i: Int = 5) {
    var i = i
    // now you can change i as you'd like
}
于 2016-08-31T09:35:12.967 回答
1

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

class SomeType {
    static let singletonInstance = SomeType()

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

    // Declare function without 'mutableParameter':
    func someFunction() {
        someFunction(SomeType.singletonInstance)
    }
}

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

于 2018-03-01T06:26:02.547 回答
0

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

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

func foo(bar: inout Int) {
    // do stuff
}
于 2020-12-06T08:50:36.157 回答