Swift 字典的 "Deep-copy" 与 map()?
"Deep-copy" of Swift dictionary with map()?
我有一个 GKGameModel
将其内部状态存储在 Card
的数组 a
和一个从 Int
映射的字典 b
中到 Card
的数组。 GameplayKit 要求我必须在 setGameModel:
中复制这个内部状态。
以下代码用于 just-copy 数组和 "deep-copy" 字典。 FWIK 这应该足够了,因为 Card
s 本身永远不会改变。
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
我有一个 GKGameModel
将其内部状态存储在 Card
的数组 a
和一个从 Int
映射的字典 b
中到 Card
的数组。 GameplayKit 要求我必须在 setGameModel:
中复制这个内部状态。
以下代码用于 just-copy 数组和 "deep-copy" 字典。 FWIK 这应该足够了,因为 Card
s 本身永远不会改变。
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