【问题标题】:Inout arguments are not allowed to alias each otherInout 参数不允许相互别名
【发布时间】:2018-09-17 06:58:41
【问题描述】:

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

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

    print(a)
    print(b)

}

var a = 12    

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

【问题讨论】:

  • 首先,你试图将同一个变量的值交换给它自己!为什么?
  • 无关:已经有一个swap函数。
  • 为什么单线程swift会出现内存冲突?我从未听说过 javascript 中的内存冲突

标签: ios swift


【解决方案1】:

来自Apple Documentation

在函数中,不要访问作为输入输出传递的值 参数,即使原始值在当前可用 范围。访问原始值是同时访问值, 这违反了 Swift 的内存排他性保证。对于相同的 原因,您不能将相同的值传递给多个 in-out 参数。

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

【讨论】:

    【解决方案2】:

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

    为什么要交换两个变量并直接返回它们, 所以两次传递相同的变量是行不通的

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

    传入同一个变量是试图为同一个变量设置 2 个值,先生,

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

    【讨论】:

      【解决方案3】:

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

      内存访问的特性

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

      • 至少有一个是写访问。
      • 它们访问内存中的相同位置。
      • 它们的持续时间重叠。”

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        • 1970-01-01
        • 1970-01-01
        • 2020-01-22
        • 1970-01-01
        相关资源
        最近更新 更多