【问题标题】:Swift: What happens when a reference type constant is assigned to a variable, but that variable changes?斯威夫特:当一个引用类型常量被分配给一个变量,但该变量发生了变化时会发生什么?
【发布时间】:2020-12-07 10:31:13
【问题描述】:

我对 var 和 let 在 swift 中的引用类型之间的区别感到困惑。

在下面的代码中,让 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 是类的一个实例,因此它们是引用类型。它们应该指向完全相同的内存地址。但我很困惑为什么

当前 = current.next!

不会使 head 也等于 current.next。

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

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

【问题讨论】:

    标签: swift variables linked-list constants reference-type


    【解决方案1】:

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

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

    【讨论】:

    • 好的,您的回答很有帮助,但仍有部分我不清楚。这种思维方式是否正确:“current.next = ListNode(3)”这段代码正在改变当前实例的属性,而“current = current.next!”只是改变电流指向的地方吗?你怎么知道一个正在改变属性,而另一个正在改变变量指向? “指向”到底是什么意思?
    猜你喜欢
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 2022-11-26
    • 2018-01-16
    • 2012-06-03
    • 1970-01-01
    相关资源
    最近更新 更多