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)
为什么单独的Immutable Arrays允许更新操作,为什么不允许不可变词典进行更新操作。
在编写的文档中,为了获得最佳性能,请将固定大小的数组指定为不可变(常量)数组。在这个不可变数组上执行的最佳事情是什么。思考....
答案 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知道