当我运行以下代码时,我得到了预期的输出:
var a = [1, 2, 3]
var b = a
if a === b { println("a === b") }
if a == b { println("a == b") }
输出:
a === b
a == b
但是,如果我突然导入基金会,我只有一个新的输出:
import Foundation
var a = [1, 2, 3]
var b = a
if a === b { println("a === b") }
if a == b { println("a == b") }
输出:
a == b
有谁知道幕后发生了什么?谢谢。
答案 0 :(得分:5)
它与可变性有关,尽管import Foundation
部分很有趣。我的猜测是它与NSArray
或NSObject
复制有关。
您可以通过将var
更改为let
并再次观看===
来进行测试。
测试不同的排列,看看会发生什么:
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
这实际上是制作防御性副本的正确行为,仅在必要时。
如果您的来源是可变的,您必须制作副本,否则可以在外部进行更改。如果你想要一个可变的副本,你需要复制当然。
没有制作副本的唯一时间是源和副本都是不可变的,因为那样会浪费。