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中的数组并不相同?
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中的数组并不相同?
好吧,它看起来像一个错误。
数组是swift中的值类型,但复制行为与枚举,字典等其他值类型略有不同。
对于数组,只有在执行可能会修改数组长度的操作时才会进行复制。
这意味着如果你想要一个操作,可以改变数组的长度,复制发生。就像你添加或删除一个项目,替换项目。在你的情况下,你只是将你的数组分配给一个新的变量。我不认为这是改变阵列长度的潜力。
后检查的功能标头位,我意识到
的===
操作者通常只定义为对象(AnyObject
)
Array
是一个结构,但它们增加了一个===
操作者对于数组,
/// Returns true iff these arrays reference exactly the same elements.
func ===<T : ArrayType, U : ArrayType>(lhs: T, rhs: U) -> Bool
以我的理解应该是true
为例,所以它实际上可能是一个bug。
编辑:这已被固定在DP2
看起来像一个bug,因为改变'arraya'更新的元素'arrayb'一样,所以他们显然仍共享相同的存储。你应该向Apple提交一个bug。 – Greg
请注意,当你使用'==='时,你不检查数组是否相同,你检查它们是否是*相同的数组*(在这种情况下,它们显然是,这就是它为什么是BUG)。如果你想检查数组是否相同*,使用'=='。 (只是想澄清这一点,因为这个问题的措辞在这个意义上是不明确的) – Greg
对于它的价值,将两个变量都改为常量使得条件成立。 –