小编典典

如何在Swift中访问深度嵌套的字典

swift

我的应用程序中有一个非常复杂的数据结构,需要对其进行操作。我试图跟踪玩家在他们的花园中有多少种错误。有十种错误,每种错误都有十种模式,每种模式都有十种颜色。所以可能有1000个独特的错误,我想追踪玩家每种类型的错误数量。嵌套的字典如下所示:

var colorsDict: [String : Int]
var patternsDict: [String : Any] // [String : colorsDict]
var bugsDict: [String : Any] // [String : patternsDict]

我没有使用此语法的任何错误或投诉。

当我想增加播放器的错误收集时,请执行以下操作:

bugs["ladybug"]["spotted"]["red"]++

我收到此错误: 字符串不能转换为’DictionaryIndex <字符串,任何>’ ,并且错误的胡萝卜在第一个字符串下。

另一个类似的帖子建议使用“作为任何吗?” 在代码中,但是该职位的OP只有一本很深的字典,所以可以轻松地做到这一点:dict [“ string”] as
Any?…

我不确定如何使用多级字典来做到这一点。任何帮助,将不胜感激。


阅读 414

收藏
2020-07-07

共1个答案

小编典典

使用字典时,必须记住字典中可能不存在键。因此,字典总是返回可选内容。因此,每次您通过按键访问字典时,都必须按照以下步骤在每个级别上展开包装:

bugsDict["ladybug"]!["spotted"]!["red"]!++

我假设您了解可选内容,但为了清楚起见,如果您100%确信字典中存在键,请使用感叹号,否则最好使用问号:

bugsDict["ladybug"]?["spotted"]?["red"]?++

附录 :这是我在操场上测试的代码:

var colorsDict = [String : Int]()
var patternsDict =  [String : [String : Int]] ()
var bugsDict = [String : [String : [String : Int]]] ()

colorsDict["red"] = 1
patternsDict["spotted"] = colorsDict
bugsDict["ladybug"] = patternsDict


bugsDict["ladybug"]!["spotted"]!["red"]!++ // Prints 1
bugsDict["ladybug"]!["spotted"]!["red"]!++ // Prints 2
bugsDict["ladybug"]!["spotted"]!["red"]!++ // Prints 3
bugsDict["ladybug"]!["spotted"]!["red"]! // Prints 4
2020-07-07