swift - Inout in swift 和引用类型

标签 swift reference inout

我试图理解值和引用类型之间的区别。现在我想使用苹果指南中的功能:

func swapTwoInts(_ a: inout Int, _ b: inout Int) {
  let temporaryA = a
  a = b
  b = temporaryA
}

如果我想使用这个函数,我会写这段代码

swapTwoInts{&firstIntStruct, &secondIntStruct}

我明白了,我们必须把这个函数放入引用类型,但是Int是一个值类型,所以我们使用&。
另一方面,当我尝试在交换函数中将 Int 更改为我的类时,我还必须在我的类实例之前编写 &。

如果它已经是引用,为什么我必须这样做?

最佳答案

假设我们编写了您正在谈论的假设函数:

class C {}

func swapTwoC(_ lhs: C, rhs: C) {
    let originalLHS = lhs
    lhs = rhs
    rhs = originalLHS
}

直接的问题是 lhsrhs 是不可变的。要改变它们,我们需要制作可变副本:

func swapTwoC(_ lhs: C, rhs: C) {
    var lhs = lhs; var rhs = rhs
    let originalLHS = lhs
    lhs = rhs
    rhs = originalLHS
}

但现在的问题是我们正在改变我们的副本,而不是我们的调用者给我们的原始引用。

更根本的问题是,当您将引用(对类的实例,我们称为对象)传递给函数时,引用本身会被复制(它的行为类似于值类型)。如果该函数更改引用的值,它只会改变它自己的本地副本,正如我们所见。

当你有一个 inout C,并且你传入 &myObject 时,你实际传入的是一个 对你对 的引用的引用我的对象。复制函数参数时,复制的是这个“ref to a ref”。然后该函数可以使用该“ref to a ref”为调用者拥有的引用 myObject 分配一个新值

关于swift - Inout in swift 和引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50260849/

相关文章:

Javascript - 有时只能修改传递给函数的数组

swift - 如何检测观察者何时完成 Firebase

iOS 11 - 成为第一响应者不打开键盘

c++ - 在 C++ 中使用引用和指针的原因和位置

reference - 访问返回参数的组件时出现ThisIsNotAObjectReference错误

kotlin - 在Kotlin中,如何检查输入是否仅为字母

ios - 如何在闭包内设置 Inout 参数

swift - 作为 inout 参数的不可变值

iOS 11 双击图像会关闭 UIImagePickerController 和演示者 View Controller

ios - 在 PFUser 注册后创建一个 PFObject 和 PFRelation