2015-08-20 55 views
0

我有一個GKGameModel,其內部狀態存儲在Card s的數組aInt s到Card s的數組映射的字典b。 GameplayKit要求我必須在setGameModel:中複製這個內部狀態。Swift字典的「Deep-copy」與map()?

以下代碼旨在just-copy數組和「深度複製」字典。 FWIK這應該是足夠的,因爲Card本身永遠不會改變。

var a: [Card] 
var b: [Int: [Card]] 

func setGameModel(gameModel: GKGameModel) { 
    let otherGameModel = gameModel as! GameModel 
    a = otherGameModel.a 
    b = otherGameModel.b.map { (i: Int, cards: [Card]) in (i, cards) } 
} 

然而,這引起了線以下語法錯誤試圖「深拷貝」:

不能指定類型的值「[(智力,[卡])」到 '[Int,[Card]]'的值。

我在做什麼錯?

+0

我斯威夫特的有點生疏這將使用其他括號:'[我:詮釋,卡:[卡]]在[我,卡]'。語法可能不正確,但問題是沿着這條線...... – LearnCocos2D

回答

1

一個Array你的情況:

b = otherGameModel.b 

是足夠。因爲,Array and Dictionary are both value types。所以當它被分配給另一個變量時,它會被複製。 (:詮釋,卡:[卡] i)的第(i,卡)`定義了一個數組,但你想要一本字典,當涉及到的文字,但像vadian說,這個'

var bOrig: [Int: [Int]] = [1: [1,2,3], 2:[2,3,4]] 
var bCopy = bOrig 

bCopy[1]![2] = 30 

bOrig[1]![2] // -> 3 
bCopy[1]![2] // -> 30 
1

該錯誤消息表明有一個類型不匹配:

可變b被聲明爲Dictionary<Int,[Card]>但地圖函數返回的tuplets (Int, [Card])

+0

所以這可以用'map()'來解決,還是有更好的選擇? – Drux

+0

不,因爲'Dictionary'不響應'map()'。您可以使用枚舉器。 – vadian

+0

我會嘗試這個替換的有問題的行:'b = [:];對於(我,卡)在otherGameModel.b {hands [i] = cards}' – Drux