2014-06-26 84 views
1

我们可以更改任何类型的值在快速朗读类型字典。不可变字典价值变化

,如:

let arr2 : AnyObject[] = [1, "23", "hello"] 
arr2[1] = 23 
arr2 // output: [1,23,"hello"] 


let arr1 :Dictionary<Int,AnyObject> = [1: "One" , 2 : 2] 
arr1[2] = 4 // not posible error 
arr1 

在永恒阵列的情况下,我们可以在不可变 字典的情况下,改变像上面而不是它的价值。为什么?

+0

http://stackoverflow.com/questions/24096096/immutable-mutable-collections-in-swift/24096192#24096192(在Xcode6的β-6运行)。这不是一个骗局,只是它有一些有用的信息。 – nicael

+0

底线的答案是Apple在数组方面选择了“不可变”的非常糟糕且不一致的定义,并且该不一致的定义无论是好还是坏,都不会转入Dictionary。 –

回答

3

这是从雨燕编程语言的书采取:

对于词典,不变性也意味着你不能在字典现有密钥更换 值。一旦它们被设置,一个不可变的字典的内容不能被改变。然而,不变性对数组的意义略有不同,但是,不变性对数组有不同的含义。您 仍然不允许执行任何可能会更改不可变数组大小的操作,但是您可以为数组中的现有索引设置新的值 。

2

let声明的数组只有不可变的长度。内容仍然可以改变。
let声明的词典是完全不可变的,你不能改变它的内容。如果你想,你必须使用var而不是let

1

从那以后,Swift发生了很大的变化。

ArrayDictionary是值类型。当用let声明时,他们不能再改变。特别是,不能重新分配它们或其中的元素。

但是,如果元素的类型是引用类型,则可以更改ArrayDictionary中元素的属性。

下面是一个示例。

class Point { 
    var x = 0 
    var y = 0 
} 

let valueArr: [Int] = [1, 2, 3, 4] 
let refArr: [Point] = [Point(), Point()] 

valueArr[0] = -1 // error 
refArr[0] = Point() // error 
refArr[0].x = 1 

let valueDict: [Int : Int] = [1: 1, 2: 2] 
let refDict: [Int: Point] = [1: Point(), 2: Point()] 
valueDict[1] = -1 //error 
refDict[1] = Point() //error 
refDict[1]!.x = -1