2015-03-19 2 views
0

У меня есть такой словарь. Это набор параметров, которые должны быть установлены в теле 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]] 
} 

У меня есть два разных метода для создания каждого раздела.

Я не знаю, как объединить вывод этих двух, потому что их типы вывода различны.

+0

Там может быть несколькими способами, один предварительно определяет ваши ключи в массиве, зацикливает его и имеет общую функцию, которая может создавать значения для использования ключа, если условие else. – iphonic

ответ

0

Вам необходимо создать функцию слияния самостоятельно, которая будет проходить через оба словаря и объединить их в один. Я думаю, причина, по которой Apple не будет предоставлять эту функцию, есть, если есть конфликт (тот же ключ присутствует в обоих словарях)?

Для того, что вы хотите сделать, я думаю, что может быть проще создать 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 
Смежные вопросы