Swift 字典的 "Deep-copy" 与 map()?

"Deep-copy" of Swift dictionary with map()?

我有一个 GKGameModel 将其内部状态存储在 Card 的数组 a 和一个从 Int 映射的字典 b 中到 Card 的数组。 GameplayKit 要求我必须在 setGameModel: 中复制这个内部状态。

以下代码用于 just-copy 数组和 "deep-copy" 字典。 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) }
}

但是,这会在尝试 "deep-copy":

的行中导致以下语法错误

Cannot assign a value of type '[(Int, [Card])]' to a value of type '[Int, [Card]]'.

我做错了什么?

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

变量 b 被声明为 Dictionary<Int,[Card]> 但映射函数 returns 是 tuplets (Int, [Card])

Array

你的情况:

b = otherGameModel.b

足够了。

因为,Array and Dictionary are both value types。所以当它被赋值给另一个变量时,它会被deep复制。

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