Swift Inout 参数

17 Mar 2025 | 阅读 2 分钟

在编程中,有些情况下我们需要修改传递给函数的参数。然而,Swift 默认不允许我们修改函数参数,因为函数参数是常量。如果我们尝试在函数体内部修改函数参数,将会得到一个编译时错误。这是一种安全措施,以防止我们错误地修改参数。

但是,如果我们希望在函数体内部修改函数参数,并且希望修改在函数作用域之外也生效,我们可以将参数定义为 in-out 参数。

要将参数定义为 in-out,Swift 在参数类型之前提供了 inout 关键字。in-out 参数的值在函数内部被修改,并返回以替换原始值。

in-out 参数的使用方法如下。

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

这被称为按值调用或拷贝输入-拷贝输出。当计算属性作为 in-out 参数传递时,它的 getter 方法在函数调用时被调用,而它的 setter 方法在函数返回时被调用。

但是,我们不能将常量或字面量定义为 in-out 参数,因为常量和字面量的值不能被修改。当我们传递一个变量作为 inout 参数时,我们在变量名前面使用一个与号 (&),以指示这些变量作为 inout 参数传递给函数。

我们还必须注意,inout 参数不能有默认值,并且可变参数不能定义为 inout。

让我们考虑以下示例,它定义了一个函数 swap(),用于使用第三个变量交换两个整数的值。

它在控制台上打印以下输出。

"a = 10 b = 20"
"a = 20 b = 10"

上面的例子表明,两个整数变量 a 和 b 的原始值被 swap(_:_:) 函数修改了,即使它们最初是在函数外部定义的。