2

我有一个GKGameModel将其内部状态存储在 s 数组aCard的一个字典和一个从sb映射到s 数组的字典。GameplayKit 要求我必须将这个内部状态复制到.IntCardsetGameModel:

以下代码旨在仅复制数组并“深度复制”字典。FWIK 这应该就足够了,因为Cards 本身永远不会改变。

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])]”类型的值分配给“[Int, [Card]]”类型的值。

我究竟做错了什么?

4

2 回答 2

2

在你的情况下:

b = otherGameModel.b

足够了。

因为ArrayDictionary都是值类型。所以当它被赋值给另一个变量时,它会被深度复制。

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
于 2015-08-20T13:24:24.480 回答
1

错误消息显示存在类型不匹配:

变量b被声明为Dictionary<Int,[Card]>但 map 函数返回一个Arrayoftuplets (Int, [Card])

于 2015-08-20T11:31:08.167 回答