【问题标题】:Accessing deeply nested dictionary and array values in Swift在 Swift 中访问深度嵌套的字典和数组值
【发布时间】:2015-11-17 20:27:12
【问题描述】:

我有一组超级嵌套的字典和数组

var lines = ["set0":["lines":["Line one","Line two"],"pickone": ["set1":"Apples","set2":"Oranges"]] ,"set1":["lines":["第一行","第二行"],"pickone":["set3":"Bananas","set4":"葡萄柚"]]]

我有两个问题:

  1. 有什么办法可以让那些嵌套字典的结构更易读

  2. 如何访问嵌套数组的值

例如,在 Playground 中,我正在尝试以下代码:

lines["set0"]!["lines"]

但我根本没有得到任何结果。

【问题讨论】:

  • lines["set0"]!["lines"] 在我的操场上工作得很好。
  • 你的例子works

标签: ios arrays swift dictionary


【解决方案1】:

关于您的问题 2: 在你的代码稍作改动后,你就可以遍历它的所有分支了。

var lines:AnyObject = ["set0":["lines":["Line one","Line two"],"pickone": ["set1":"Apples","set2":"Oranges"]],"set1":["lines":["Line one","Line two"],"pickone":["set3":"Bananas","set4":"Grapefruits"]]]

    NSLog("original object:\(lines)")
    NSLog("all keys array:\(lines.allKeys)")


    if(lines.isKindOfClass(NSDictionary)){
        for key  in lines.allKeys{
            var innerDictionary:AnyObject! = lines.valueForKey(key as! NSString as String)
            //NSLog("inner dictionary:\(innerDictionary)")
            NSLog("depth2 keys array:\(innerDictionary.allKeys)")
            if(innerDictionary.isKindOfClass(NSDictionary)){

                for innerKey  in innerDictionary.allKeys{
                    var innerValue:AnyObject! = innerDictionary.valueForKey(innerKey as! NSString as String)

                    if(innerValue.isKindOfClass(NSDictionary)){
                        NSLog("Depth3 keys array:\(innerValue.allKeys)")
                        var mostInnerDicionary:AnyObject! = innerDictionary.valueForKey(innerKey as! NSString as String)
                        NSLog("most inner Dictionary:\(mostInnerDicionary)")
                        for mostInnerKey  in mostInnerDicionary.allKeys{
                        var mostInnerValue:AnyObject! = mostInnerDicionary.valueForKey(mostInnerKey as! NSString as String)
                            NSLog("most inner Value:\(mostInnerValue)")
                        }

                    }else{
                       NSLog("innerValue:\(innerValue)")
                    }

                }
            }
        }
    }

输出:运行并检查控制台日志中的输出

【讨论】:

    【解决方案2】:

    关于让它可读的尝试:

    var lines = [
        "set0":[
            "lines":[
                "Line one",
                "Line two"
            ],
            "pickone":[
                "set1":"Apples",
                "set2":"Oranges"
            ]
        ],
        "set1":[
            "lines":[
                "Line one",
                "Line two"
            ],
            "pickone":[
                "set3":"Bananas",
                "set4":"Grapefruits"
            ]
        ]
    ]
    

    至于你的台词:

    lines["set0"]!["lines"]
    

    我可以确认它正在工作。也许你应该给 Playground 一些时间来显示结果。或者,您可能忘记了:

    import Foundation
    

    【讨论】:

    • 是的,经过仔细检查后我可以确认它有效)谢谢您的建议。
    • @Andriy 嗨,我在 swift 4.2 中也面临同样的问题。我不能那样做。您能否在 swift4.2 中添加相同问题的代码。
    猜你喜欢
    • 2014-10-17
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多