2015-03-19 102 views
0

我有这样的字典。这是一组要在HTTP主体中设置的参数。所述parameters可变的合并两个字典

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

类型推理输出为[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]] 
} 

我有两个独立的方法来创建每个部分。

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

+0

可以有可以有多种方式,一种是在数组中预先定义你的密钥,循环它,并且有一个通用的函数,它可以使用if else条件为密钥创建值。 – iphonic 2015-03-19 09:10:54

回答

0

您将需要自己创建合并函数,它将遍历两个字典并将它们合并为一个。我认为苹果公司不会提供这种功能的原因是,如果存在冲突(两本字典中都有相同的关键字)?

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

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