合并两个词典

时间:2015-03-19 09:06:40

标签: ios swift dictionary array-merge

我有这样的字典。它是一组要在HTTP正文中设置的参数。

let parameters = [ "UserCredentials": [ "Personalnumber": personalNo, "Password": password ], "DeviceCredentials": ["UniqueId": uniqueId] ]

parameters变量的类型推断输出为[String : Dictionary<String, String>]

我想要做的不是明确地创建这个字典,而是想构建它。正如在函数中创建它的每个部分并最终合并它们以使最终输出为上面显示的原始部分。

func deviceCredentials() -> [String: [String: String]] {
    return ["DeviceCredentials" : ["UniqueId": "1212121212"]]
}

func userCredentials(pnr: String, password: String) -> [String: [[String: String]]] {
    let personalNo = ["Personalnumber": pnr]
    let password = ["Password": password]

    return ["UserCredentials": [personalNo, password]]
}

我有两种不同的方法来创建每个部分。

我不知道如何合并这两个输出,因为它们的输出类型不同。

2 个答案:

答案 0 :(得分:0)

您需要自己创建合并功能,它将遍历两个词典并将它们合并为一个。我认为Apple没有提供该功能的原因是,如果存在冲突(两个词典中都存在相同的密钥)会怎样?

对于你想做的事情,我认为创建一个NSMutableDictionary然后将它作为参数传递给两个函数可能更容易,这样每个函数都可以添加它需要添加的对象。

答案 1 :(得分:0)

由于您的内部词典类型不同,因此在定义最外层词典时需要使用AnyObject,并在必要时检索项目时使用向下转换。您还可以返回元组而不是字典,以便更容易构建最外层的字典 -

func deviceCredentials() -> (key:String, value:[String: String]) {
    return ("DeviceCredentials",["UniqueId": "1212121212"])
}

func userCredentials(pnr: String, password: String) -> (key:String, value:[[String: String]]) {
    let personalNo = ["Personalnumber": pnr]
    let password = ["Password": password]

    return ("UserCredentials", [personalNo, password])
}

var dict=Dictionary<String,AnyObject>()

let deviceCreds=deviceCredentials()

dict[deviceCreds.key]=deviceCreds.value

let userCreds=userCredentials("user", "password")

dict[userCreds.key]=userCreds.value

但是,您可以稍微更改userCredentials值的结构并使用 -

func deviceCredentials() -> (key:String, value:[String: String]) {
    return ("DeviceCredentials",["UniqueId": "1212121212"])
}

func userCredentials(pnr: String, password: String) -> (key:String, value:[String: String]) {
    var retDict=Dictionary<String,String>()
    retDict["Personalnumber"] = pnr
    retDict["Password"]= password

    return ("UserCredentials", retDict)
}

var dict=Dictionary<String,Dictionary<String,String>>()

let deviceCreds=deviceCredentials()

dict[deviceCreds.key]=deviceCreds.value

let userCreds=userCredentials("user", "password")

dict[userCreds.key]=userCreds.value