2014-06-26 81 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