inout(copy-in-copy-out)

12/5/2021 swiftios

# inout(copy-in-copy-out)

在 Swift 中,函数参数默认是常量。试图在函数体中更改参数值将会导致编译错误。这意味着你不能更改参数值。如果想要一个函数可以修改参数的值,并且想要这些修改在函数调用结束后仍然存在,那么把这个参数定义为inout即可。

var variable: Int = 1

func changeNumber(num: Int) {
    num = 2
    print(num)
}

changeNumber(num : variable)

无法编译通过:

-w878

我们不能修改函数的参数。但是通过inout定义输入输出参数:

var variable: Int = 1

func changeNumber(num:inout Int) {
    num = 2
    print(num)
}

changeNumber(num: &variable) // 2

-w519

在函数调用的时候,我们使用的&可能会给你的印象:传递引用——特别是如果你有 C 或 C++ 背景。但 inout

An inout parameter has a value that is passed in to the function, is modified by the function, and is passed back out of the function to replace the original value.

&的使用确实将实参的内存地址传入函数(实参进行引用传递),但changeNumber内部并未操作指针,采取了Copy In Copy Out的做法:

  • 调用该函数时,先复制实参的值,产生副本【get】
  • 将副本的内存地址传入函数(副本进行引用传递),在函数内部可以修改副本的值
  • 函数返回后,再将副本的值覆盖实参的值【set】

关于inout的更详细讨论,请参阅

# 总结

inout 在 Swift 是一个高频使用的关键字,以至于不得不独立出一篇文章强调它的 copy-in copy-out,以防经验的造成的思维定式。

更好的去理解代码,写出更好的代码。

# 参阅

上次更新: 12/6/2021, 5:22:35 PM