Arhn - архитектура программирования

Как преобразовать словарь с массивом в строку и обратно?

Как преобразовать словарь с массивом в строку и обратно?

["http://www.somehost.com": 
    [
        "some_name",
        "some_pass",
        "date_modification",
        "other_stuff"
    ]
]

// convert it to string

"skdjfsfjkhjsdfjh:sdlfksdfkj / sdlkfjsdfkj / sldkfsdkjfkjh / skjdfsdjhsd"

// convert string back to ["host": ["name","pass","date","other_stuff"]

Могу ли я использовать для этого JSON?

29.11.2017

  • Если вы хотите использовать JSON, проверьте этот вопрос. 29.11.2017
  • Не могли бы вы опубликовать действительный пример. Ваш исходный словарь, ваша строка и ваш новый словарь не имеют общих данных, поэтому совершенно непонятно, что вы пытаетесь сделать. 29.11.2017

Ответы:


1

Внесена небольшая поправка в строку, так как ключ словаря (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
  • ты сделал мой день, чувак! 29.11.2017
  • Интересно, что не так с использованием JSONSerialization API вместо того, чтобы пытаться реализовать свой собственный 29.11.2017
  • я был в беспорядке со всем, я думал, что можно сделать с json, но я новичок и учусь, просто полностью испортил все. 29.11.2017
  • Обратите внимание, что если какой-либо элемент значения массива любого ключа словаря содержит ::, этого будет достаточно, чтобы он вернул пустой словарь. 29.11.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..