当我运行以下代码时,我得到了预期的输出:

var a = [1, 2, 3]
var b = a

if a === b { println("a === b") }
if a == b { println("a == b") }
输出:

但是,如果我突然导入Foundation,我只会得到一个新的输出:
import Foundation

var a = [1, 2, 3]
var b = a

if a === b { println("a === b") }
if a == b { println("a == b") }
输出:

有人知道幕后发生了什么吗?谢谢你。

最佳答案

尽管import Foundation部分很有趣,但它与可变性有关。我的猜测是,它与NSArrayNSObject复制有关。

您可以通过将var更改为let并观看===再次变为true来进行测试。

测试不同的排列,看看会发生什么:

两者都是可变的

var a = [1, 2, 3]
var b = a

if a === b { println("arrays are the same instance") }  // false
if a == b { println("arrays are equivalent") }  // true

可变来源,不可变副本
var a = [1, 2, 3]
let b = a

if a === b { println("arrays are the same instance") }  // false
if a == b { println("arrays are equivalent") }  // true

不可变的来源,可变的副本
let a = [1, 2, 3]
var b = a

if a === b { println("arrays are the same instance") }  // false
if a == b { println("arrays are equivalent") }  // true

都是不可变的
let a = [1, 2, 3]
let b = a

if a === b { println("arrays are the same instance") }  // true
if a == b { println("arrays are equivalent") }  // true

实际上,只有在必要时,这才是制作防御性副本的适当行为。

如果源是可变的,则必须进行复制,否则可以在外部进行更改。如果您想要一个可变的副本,那么您当然需要制作一个副本。

唯一无法复制的是源和副本都是不可变的,因为那样会很浪费。

关于arrays - 使用 'import Foundation'快速改变数组的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24149456/

10-11 23:55
查看更多