【问题标题】:Appending to Array in Deeply Nested Dictionary of Arrays在深度嵌套的数组字典中附加到数组
【发布时间】:2015-11-08 10:05:13
【问题描述】:

我在 Swift 中遇到以下问题。首先,我声明一个数据结构,如下所示:

var books = [String : Dictionary<String, Dictionary<String, Dictionary<String, Array<Dictionary<String, String>>>>>]()

我稍后像这样初始化 var:

books = [
    "Fiction" : [
        "Genre Fiction" : [
            "Mystery" : [
                "Classics" : [
                    ["Title" : "Ten Little Indians",
                     "Author" : "Agatha Christie",
                     "read" : "no"],
                    ["Title" : "A Study in Scarlet",
                     "Author" : "Arthur Conan Doyle",
                     "read" : "no"],
                ]
            ]
        ]
    ]
]

请注意,编译器不会抱怨它。后来,我创建了一个新字典,我想将它附加到最里面的数组中,如下所示:

var bookDict = Dictionary<String, String>()
bookDict = ["title" : dict.valueForKey("title") as! String,
            "author": dict.valueForKey("author") as! String,
            "read"  : dict.valueForKey("read") as! String ]
books["category"]["genre"]["focus"]["set"].append(bookDict)

但是,我收到一个编译器错误“无法使用类型参数列表调用附加 (Dictionary )”。这让我很困惑,因为 book 数据结构被声明为使得最里面的数组是 Dictionary 的数组。

我错过了什么?

【问题讨论】:

    标签: arrays swift dictionary append


    【解决方案1】:

    在编译期间不清楚该键是否真的存在于字典中,因此字典总是返回可选值。您必须检查此选项:

    if let category = books["Fiction"] {
        if let genre = category["Genre Fiction"] {
            if let focus = genre["Mystery"] {
                if var set = focus["Classics"] {
                    set.append(bookDict)
                }
            }
        }
    }
    

    或者你也可以这样做:

    books["Fiction"]?["Genre Fiction"]?["Mystery"]?["Classics"]?.append(bookDict)
    

    【讨论】:

    • 这让我更接近了!它不再给出编译器错误,这很好。我修改了追加调用以从另一个字典中提取下标字符串,如下所示:
    • bookage[dict.valueForKey("category") as! String]?[dict.valueForKey("genre") as! String]?[dict.valueForKey("focus") as! String]?[dict.valueForKey("set") as! String]?.append(bookDict)
    • 那么现在的问题是什么?
    • 但是当我后来 println() 字典中的所有新条目都不存在。当没有找到字典键时,它不是自动创建键的情况吗?似乎它在 Obj-C 中是这样工作的。
    • 您将键命名为“Fiction”而不是“category”、“Genre Fiction”而不是“genre”等...根据您发布的代码,您使用了错误的键。请发布完整代码。
    猜你喜欢
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2020-06-25
    • 1970-01-01
    • 2019-05-05
    • 2013-11-09
    • 2020-12-10
    相关资源
    最近更新 更多