【问题标题】:How to add value to dictionary without replacing it?如何在不替换字典的情况下为字典添加值?
【发布时间】:2017-08-09 14:08:20
【问题描述】:

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

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
    }
    

我想动态添加详细信息,因为我不知道我的字典会是什么样子。 所以向字典添加值而不覆盖它们对我来说是必须的。

【问题讨论】:

  • dict["login"]?["password"] = "1234" 但更重要的是......您是否有理由为此使用字典,而不是结构或类?
  • 是的,我需要 Alamofire 身体参数的字典。我已经编辑了我的问题,所以它会更清楚
  • 只是一个建议,你可以看看SwiftyJSON,它使得在 Swift 中处理 JSON 数据变得非常简单。它使代码更具可读性,并且可选的包装是自动完成的。

标签: swift dictionary swift3


【解决方案1】:

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

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

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

【讨论】:

  • 您很快就会忘记哪些项目在您的字典中,哪些项目不在。您已经可以看到操作字典是一个小麻烦。我强烈建议您定义一个struct 来包含所有可能的数据。对于 Swift 3,您可以使用 ObjectMapper 将其转换为 JSON。对于 Swift 4,您可以查看 Codable。
  • 我在 GitHub 上看到了 ObjectMapper,但是否可以将其转换为字典?如果我需要一些数据怎么办?我怎样才能避免零字段?
【解决方案2】:

反映问题中的编辑:在不知道字典的确切结构的情况下,您无法随意修改它。无论如何,直接修改 JSON 字典是非常糟糕的做法。

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

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

【讨论】:

    【解决方案3】:

    您不能在不知道类型和内容的情况下直接将新值“附加”到动态字典。

    自从

    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
    
    }
    

    【讨论】:

      猜你喜欢
      • 2015-05-28
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 2019-12-14
      • 2017-06-21
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多