如何在不替换字典的情况下为字典添加值?

时间:2017-08-09 14:08:21

标签: swift dictionary swift3

我尝试在字典中追加值而不替换它,例如:

var dict = [String:Any]()
dict["login"] = ["user" : "jon"]
//...
//...
//...
dict["login"] = ["password": "1234"]

当我第二次尝试为登录添加值时,它会覆盖第一个值。
我该如何追加这些数据呢? 我使用的是Swift 3.

  • 编辑:让我稍微改一下我的问题。 我想构建一个动态字典,我将它作为正文参数发布到alamoFire。所以如果我有一个看起来像这样的JSON:

    {
    "name" : "Jon",
     "details" : {
                    "occupation" : "lifeguard"
                    "years_of_ex" : 3
     }
     "more_details" : "extra info"
     "inner_body" : {
                    "someInfo" : "extra info"
     }
     ... // there might be lots of other fields since it's dynamic
     ... // the server expect to have missing fields and not empty ones
    }
    

我想动态添加细节,因为我不知道我的词典会是什么样子。 所以将值添加到字典而不覆盖它是我必须的。

3 个答案:

答案 0 :(得分:1)

定义一个中间变量并赋值给它:

var dict = [String:Any]()
dict["login"] = ["user" : "jon"]

if var login = dict["login"] as? [String: String] {
    login["password"] = "1234"
    dict["login"] = login
}

答案 1 :(得分:0)

要反映问题中的编辑:在不知道字典的确切结构的情况下,您无法根据需要进行修改。无论如何,直接修改JSON字典实际上是不好的做法。

将JSON响应解析为自定义对象,根据需要修改对象,然后将对象编码回JSON并将其用作请求的正文。

如果您不想自己编写JSON解析函数,请查看ObjectMapper。它既可以将JSON响应映射到对象,也可以将对象映射到JSON。

答案 2 :(得分:0)

你不能直接"追加"在不知道类型和内容的情况下对dinamic字典的新值。

dict["login"]

返回Any?你无法直接操纵它。

您对每个字典叶的内容可能组合有什么想法吗?

你可以编写一个递归方法,尝试向下转换叶子的内容并以它为基础,尝试做一些事情

switch dict["login"] {
    case is [String: Any?]:
         // check that the key does not already exist, to not replace it
    case is [Int: Any?]:
         // Do something else

}