Отобразить словарь в массив в строку - PullRequest
0 голосов
/ 17 января 2019

Я обрабатываю словарь, который мне нужно разобрать в строку, чтобы создать свойство для мутации GraphQL. Мой словарь - [String: Bool], и мне нужно извлечь ключи, установленные на true.

let dict: [String: Bool] = ["Objct1": true, "Objct2": false, "Objct3": true]

В настоящее время я использую четыре функции (фильтр, перечисление, отображение и объединение) и, хотя я получаю желаемый результат, мне интересно, нужны ли мне все из них:

let string = dict.filter { $0.value }
    .enumerated()
    .map {
        return $0.offset == 0
            ? "\"\($0.element.key)\""
            : ", \"\($0.element.key)\""
    }
    .joined()

Edit: Последняя строка должна быть заключена в ": ""Objct1", "Objct3""

1 Ответ

0 голосов
/ 17 января 2019

Вы можете использовать один compactMap, так как сначала вам нужно filter ваш Dictionary, чтобы сохранить только значения true, затем вам нужно map, чтобы вернуть key соответствует значениям true. Однако вы всегда можете объединить последующие вызовы filter и map в один compactMap, так как compactMap сохраняет только значения non-nil, поэтому вместо возврата логического значения, как вы бы сделали для filter, в случае, если ваш условие оценивается как true, вы возвращаете все, что вернете в map, в противном случае вы возвращаете nil.

let trueKeys = dict.compactMap({key, value in value ? key : nil})

Чтобы объединить ключи в одну строку, вы можете просто позвонить joined по результату compactMap.

let graphQueryString = dict.compactMap({key, value in value ? "\"\(key)\"" : nil}).joined(separator: ",") // ""Objct3","Objct1""

Имейте в виду, что порядок ваших ключей не обязательно будет таким же, как вы объявили Dictionary, так как Dictionary является неупорядоченной коллекцией по определению. Если вы хотите сохранить порядок, вы можете использовать массив кортежей вместо Dictionary, где кортеж будет состоять из пар ключ-значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...