首页 > 解决方案 > 斯威夫特:当一个引用类型常量被分配给一个变量,但该变量发生了变化时会发生什么?

问题描述

我对 var 和 let 快速引用类型之间的区别感到困惑。

在下面的代码中,让 head 分配给 var current:

 public class ListNode {
     public var val: Int
     public var next: ListNode?
     public init() { self.val = 0; self.next = nil; }
     public init(_ val: Int) { self.val = val; self.next = nil; }
     public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
 }

var current = ListNode()
let head = current

current.next = ListNode(3)
current = current.next!

print(current.val) -> return "3"
print(head.val)  -> return "0"
print(head.next?.val) -> return "3"

我不明白为什么 head.val = 0 和 head.next.val = 3 最后。

我知道 head 和 current 是类的一个实例,因此它们是引用类型。它们应该指向完全相同的内存地址。但这让我很困惑为什么

当前=当前。下一个!

不会使 head 也等于 current.next。

head 和 current 不是指向同一个内存地址吗?为什么它们可以是不同的值?如果有人告诉我, head 不能改变值,因为它是一个常数,那么为什么 head.next?.val 改为 3?

答案一定很明显,因为我没有看到有人问这个问题。但我只是迷路了。谢谢!

标签: swiftvariableslinked-listconstantsreference-type

解决方案


您希望引用类型变量像指针一样工作,但事实并非如此。引用类型确保如果您更改特定实例的属性,该更改也将反映到对同一实例的所有其他引用。

但是,当您更改可变引用指向的实例时,不会更改的实例不会传播到指向原始实例的其他引用。其他引用仍将指向原始实例。


推荐阅读