不允许Inout参数互为别名

时间:2018-09-17 06:58:42

标签: ios swift

如果两个参数都传递相同的变量,则会出错。 谁能解释为什么我们不能在输入参数函数中传递相同的变量,而我们却可以传递普通函数

func swapTwoInts(a: inout Int, b: inout Int) {

    print(a)
    print(b)

}

var a = 12    

swapTwoInts(a: &a, b: &a)

3 个答案:

答案 0 :(得分:1)

来自Apple Documentation

  

在函数内,请勿访问作为输入输出传递的值   参数,即使原始值在当前   范围。访问原始文件是同时访问值,   这违反了Swift的内存独占保证。对于相同的   原因,您不能将相同的值传递给多个输入输出参数。

在您的示例中,您创建了2个相同变量的副本。函数返回时,必须将它们分配给原始参数。这就是这种情况下的冲突。

答案 1 :(得分:0)

因为在这种情况下,inout参数需要2个不同的变量,

为什么因为要交换两个变量并直接返回它们, 因此,两次传递相同的变量将不起作用

因为是inout参数,这意味着函数结束后它将返回带有新值的参数,

传递相同的变量正试图为将不起作用的同一个变量设置2个值,

详细了解inout参数以及它们如何执行here

答案 2 :(得分:0)

将变量“ a”作为两个参数的值传递会产生冲突,因为它试图同时对内存中的同一位置执行两次写访问。

内存访问特征

在冲突的访问环境中要考虑的三个内存访问特征:访问是读还是写,访问的持续时间以及正在访问的内存位置。具体来说,如果您具有两个满足以下所有条件的访问权限,则会发生冲突:

  • 至少一个是写访问权限。
  • 他们访问内存中的相同位置。
  • 他们的时间重叠。”

摘录自:Apple Inc.“ Swift编程语言(Swift 5.0)”。苹果书。 https://books.apple.com/in/book/the-swift-programming-language-swift-5-0/id881256329