当我运行以下代码时,我得到了预期的输出:
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
部分很有趣,但它与可变性有关。我的猜测是,它与NSArray
或NSObject
复制有关。
您可以通过将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/