2014-06-13 37 views
2
var arraya = [1,2,3,4] 

var arrayb = arraya 

if arraya === arrayb 
{ 
    println("arraya is identical to arrayb") 
} 
else 
{ 
    println("arraya is not identical to arrayb") 
} 

为什么xcode打印“arraya与arrayb不相同”?为什么在共享时,Swift中的数组并不相同?

+0

看起来像一个bug,因为改变'arraya'更新的元素'arrayb'一样,所以他们显然仍共享相同的存储。你应该向Apple提交一个bug。 – Greg

+0

请注意,当你使用'==='时,你不检查数组是否相同,你检查它们是否是*相同的数组*(在这种情况下,它们显然是,这就是它为什么是BUG)。如果你想检查数组是否相同*,使用'=='。 (只是想澄清这一点,因为这个问题的措辞在这个意义上是不明确的) – Greg

+3

对于它的价值,将两个变量都改为常量使得条件成立。 –

回答

0

好吧,它看起来像一个错误。

数组是swift中的值类型,但复制行为与枚举,字典等其他值类型略有不同。

对于数组,只有在执行可能会修改数组长度的操作时才会进行复制。

这意味着如果你想要一个操作,可以改变数组的长度,复制发生。就像你添加或删除一个项目,替换项目。在你的情况下,你只是将你的数组分配给一个新的变量。我不认为这是改变阵列长度的潜力。

0

后检查的功能标头位,我意识到

  1. ===操作者通常只定义为对象(AnyObject

  2. Array是一个结构,但它们增加了一个===操作者对于数组,

/// Returns true iff these arrays reference exactly the same elements. 
    func ===<T : ArrayType, U : ArrayType>(lhs: T, rhs: U) -> Bool 

以我的理解应该是true为例,所以它实际上可能是一个bug。

编辑:这已被固定在DP2

相关问题