Внесена небольшая поправка в строку, так как ключ словаря (http://www.somehost.com
) содержит разделитель, который вы пытаетесь использовать (:
), что делает декодирование довольно громоздким.
Поскольку легко сопоставить кортеж Dictionary
с кортежем (key, value)
, функции кодирования просты:
func encode(_ entry: (key: String, value: [String]), keySeparator: String, arraySeparator: String) -> String
{
return entry.key + keySeparator + encode(entry.value, separator: arraySeparator)
}
func encode(_ array: [String], separator: String) -> String
{
return array.joined(separator: separator)
}
Тогда декодирование может быть просто:
func decode(_ strings: [String], keySeparator: String, arraySeparator: String) -> [String:[String]]
{
return strings.reduce([String:[String]]())
{
var dict = $0
guard let decoded = decode($1, keySeparator: keySeparator, arraySeparator: arraySeparator)
else { return $0 }
dict[decoded.key] = decoded.value
return dict
}
}
func decode(_ string: String, keySeparator: String, arraySeparator: String) -> (key: String, value: [String])?
{
let split = string.components(separatedBy: keySeparator)
guard split.count == 2 else { return nil }
let key = split[0]
let value = decodeValues(split[1], separator: arraySeparator)
return (key, value)
}
func decodeValues(_ string: String, separator: String) -> [String]
{
return string.components(separatedBy: separator)
}
Наконец, запустить все можно с помощью:
let dict = ["http://www.somehost.com":
[
"some_name",
"some_pass",
"date_modification",
"other_stuff"
]
]
let keySeparator = "::"
let arraySeparator = " / "
let encoded = dict.map { encode($0, keySeparator: keySeparator, arraySeparator: arraySeparator) }
print(encoded) // ["http://www.somehost.com::some_name / some_pass / date_modification / other_stuff"]
let decoded = decode(encoded, keySeparator: keySeparator, arraySeparator: arraySeparator)
print (decoded) // ["http://www.somehost.com": ["some_name", "some_pass", "date_modification", "other_stuff"]]
Это можно было бы исправить с помощью расширений, но это поможет вам достичь цели на 80%.
29.11.2017