使用'import Foundation'快速不同的数组行为

时间:2014-06-10 19:33:43

标签: arrays swift foundation

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

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

有谁知道幕后发生了什么?谢谢。

1 个答案:

答案 0 :(得分:5)

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

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

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

两个Mutable

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

这实际上是制作防御性副本的正确行为,仅在必要时。

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

没有制作副本的唯一时间是源和副本都是不可变的,因为那样会浪费。

相关问题