为什么在swift值中的不可变数组可以改变?

时间:2014-06-18 17:51:03

标签: swift

在swift中,可以更改不可变数组中的值,但不能更改不可变字典中的值为什么?

let imArray = ["Ram","Shyam","Bharat"] 
imArray[2] = "Abhimanyu" // this change will be apply though it is immutable 

2 个答案:

答案 0 :(得分:5)

编辑:在Xcode 6 beta 3中,现在已经改变了。他们现在表现得一样。

  

Swift中的数组已经完全重新设计,具有全部价值   字典和字符串之类的语义一直都在Swift中。这个   解决了各种可变性问题 - 现在是一个'let'数组   完全不可变,'var'数组是完全可变的 -   用Dictionary和String正确编写,并解决其他更深层次的问题   问题。如果您习惯,价值语义可能会令人惊讶   NSArray或C数组:数组的副本现在生成一个完整的和   使用高效的懒惰副本独立复制所有元素   实现。这是Array的一个重大变化,也有   还有一些性能问题需要解决。请看Swift   编程语言以获取更多信息。 (17192555)


我在WWDC上与Apple工程师讨论了这个问题

对于数组,当您将其定义为常量时,这意味着后备缓冲区是常量,因此您可以更改缓冲区的内容,但不能交换缓冲区或修改其长度

对于词典,它完全是不可变的。

当然,如果您认为它的行为应该不同,请向他们提交一张票!

答案 1 :(得分:2)

来自Apple's Swift documentation收藏品的可变性 ...

  然而,

不变性对数组的意义略有不同。您仍然不允许执行任何可能更改不可变数组大小的操作,但您可以为数组中的现有索引设置新值。这使得Swift的Array类型能够在数组大小固定时为数组操作提供最佳性能。