【问题标题】:Swift array and dictionary immutability [closed]Swift 数组和字典不变性 [关闭]
【发布时间】:2014-06-18 06:22:45
【问题描述】:

swift 的“不可变数组”允许更新操作的预期设计是什么。 然而,仅“不可变字典”就免除了这种特殊行为。你的想法...

let newArray = ["1","3","4"] // Immutable <String> array 'newArray'
newArray[1]="2"//update index 1 with the value 2 (no error)
newArray[2]="3"//update index 2 with the value 3 (no error)

let newDictionary = [1 : "one", 2 : "third"]//Immutable <Int,String> Dictionary 'newDictionary'
newDictionary[2] = "second" // update 2 keyed value by "third" (throws error)
  1. 为什么不可变数组单独允许更新操作,为什么不可变字典不允许更新操作。

  2. 在编写它的文档中,为了获得最佳性能,将固定大小的数组指定为不可变(常量)数组。在这个不可变数组上执行的最佳操作是什么。想法......

【问题讨论】:

  • 为什么?为什么??只有苹果知道。语言就是这样设计的。他们可能有自己的原因

标签: arrays dictionary swift


【解决方案1】:

我们使用时字典和数组复制值

来自 Swift 书

数组:

“对于数组,仅当您执行可能修改数组长度的操作时才会进行复制。 ”

所以只要你不改变数组的大小,常量变量仍然使用相同的大小,我们的常量仍然指向旧值。

字典:

“每当您将 Dictionary 实例分配给常量或变量,或者将 Dictionary 实例作为参数传递给函数或方法调用时,字典都会在分配或调用发生时被复制。”

所以对于字典,每次你用它做某事时,它都会复制自己并分配回变量。这违反了let的规则

这是字典抄袭的证明

class Test {
    var newDictionary: Dictionary<Int,String> = [:] {
        didSet {
            println("reset")
        }
    }

    func test() {
        newDictionary = [1 : "one", 2 : "third"]
        newDictionary[2] = "second"
    }
}

Test().test()

输出是

reset
reset

编辑:即使数组在更新值时也会调用 didSet。这不能证明里面发生了什么,只有苹果知道

【讨论】:

  • 我认为,你的这个“所以对于字典,每次你用它做某事时,它都会复制自己并分配回变量。这违反了 let 的规则”行,有我想要的东西。如果您 100% 确定,请详细说明一下。
  • 将更新答案
  • 数组的行为与您尝试更新元素时​​调用的 didSet 相同。
  • 这意味着我们无法检查底层到底发生了什么,我们也看不到指针,只有苹果知道:|
猜你喜欢
  • 1970-01-01
  • 2021-10-27
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
相关资源
最近更新 更多