在swift中,可以更改不可变数组中的值,但不能更改不可变字典中的值为什么?
let imArray = ["Ram","Shyam","Bharat"]
imArray[2] = "Abhimanyu" // this change will be apply though it is immutable
答案 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类型能够在数组大小固定时为数组操作提供最佳性能。