斯威夫特:如何继续正确更新另一个词典中的词典?

时间:2018-12-22 20:25:35

标签: swift dictionary

这有点难以解释,但我会尽力而为。我正在尝试正确更新另一个词典中的一个词典。以下代码几乎可以满足我的需求。

var dictionary = Dictionary<String, [Int : Int]>()

func handleStatsValue(tag: Int ) {
        let currentValue: Int = dictionary["Score"]?[tag] ?? 0

        dictionary["Score"] = [
            tag : currentValue + 1
        ]
 }

但是,当tag值更改时(例如1到2),似乎字典已被覆盖。我需要Dictionary里面有多个字典。任何提示或建议都将受到感激。

编辑:我正在尝试将多个词典嵌套在一个词典中。似乎只要更改tag的值,字典就会被覆盖。

2 个答案:

答案 0 :(得分:2)

一种写法是:

func handleStatsValue(tag: Int) {
    dictionary["Score", default: [:]][tag, default: 0] += 1
}

或者,写成没有[_:default:]

func handleStatsValue(tag: Int) {
    var scoreDictionary = dictionary["Score"] ?? [:]
    scoreDictionary[tag] = (scoreDictionary[tag] ?? 0) + 1
    dictionary["Score"] = scoreDictionary
}

但是,使用嵌套字典来保存数据不是一个好主意。请改用自定义struct,并尝试避免使用标签:

struct DataModel {
    var score: [Int: Int] = [:]
}

答案 1 :(得分:0)

我认为您需要类似的方法来增加现有标签的值,或者添加不存在的新标签

func handleStatsValue(tag: Int ) {
    if var innerDict = dictionary["Score"] {
        if let value = innerDict[tag] {
            innerDict[tag] = value + 1
        } else {
            innerDict[tag] = 1
        }
        dictionary["Score"] = innerDict
    }    
}

尽管代码看起来与硬编码键“ Score”有些奇怪,但最好还是使用多个简单的字典,例如

var score: [Int, Int]()

或者,如果您愿意

var score = Dictionary<Int, Int>()