Swift数组和字典不变性

时间:2014-06-18 06:22:45

标签: arrays dictionary swift

swift的'Immutable Arrays'的预期设计允许更新操作。 鉴于,“不可变词典”单独豁免此特定行为。你的想法......

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. 为什么单独的Immutable Arrays允许更新操作,为什么不允许不可变词典进行更新操作。

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

1 个答案:

答案 0 :(得分: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。这无法证明内部发生的事情,只有Apple知道