2017-08-09 46 views
0

我想追加字典里面没有值替换它,例如:如何在不替换字典的情况下为字典添加值?

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

当我尝试添加值在第二次登陆,它的覆盖第一个值。
如何追加这些数据?
我用斯威夫特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 
    } 
    

我要添加动态细节,因为我不知道我的解释将如何模样。 所以增加值到词典而不覆盖它们对我来说是必须的。

+0

'字典[“登录”] [“密码”] =“1234 “'但更重要的一点...是否有一个原因,你用这个字典,而不是一个结构或类? – Alexander

+0

是的,我需要Alamofire身体参数字典..我编辑我的问题,所以它会更清晰 – XcodeNOOB

+0

只是一个建议,你可以看看[SwiftyJSON](https://github.com/SwiftyJSON/SwiftyJSON)这使得在Swift中使用JSON数据非常简单。它使代码更加可读,可选的包装自动完成。 –

回答

0

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

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

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

+0

我编辑了我的问题... – XcodeNOOB

+0

@XcodeNOOB检查我编辑的答案 –

1

定义一个中间变量,并分配给它:

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

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

我编辑了我的问题... – XcodeNOOB

+0

您将很快失去跟踪哪些项目在您的字典中,哪些不是。你已经可以看到操纵字典是一件小事。我强烈建议你定义一个'struct'来包含所有可能的数据。对于Swift 3,你可以使用ObjectMapper将它转换为JSON。对于Swift 4来说,你可以查看“Codable”。 –

+0

我在GitHub上看到了ObjectMapper,但有可能将它转换为字典吗?如果我需要一些数据呢?我怎样才能避免无字段? – XcodeNOOB

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 

}