Swift: словарь из массива ключей и значений

#ios #arrays #swift #dictionary

#iOS #массивы #swift #словарь

Вопрос:

Мне нужно преобразовать массив ключей и значений, например:

 ["key1", "value1", "key2", "value2"]
 

в словарь:

 {"key1": "value1", "key2": "value2"}
 

Я могу пройти через массив с шагом в два и получить n и n 1 для ключа и значения соответственно, но есть ли какой-нибудь разумный способ сделать это?

Спасибо!

Комментарии:

1. Вы можете быть более функциональными и использовать stride , map , filter и т.д., Но вы все равно будете делать то же самое «пройдите по массиву с шагом в два и получите n и n 1 для ключа и значения». Я не думаю, что вы можете избежать записи числа «2» и получения n и n 1, не жертвуя при этом удобочитаемостью.

Ответ №1:

Вы можете получить свою коллекцию в подпоследовательностях по два и свести их в словарь:

 extension Collection {
    func unfoldSubSequences(limitedTo maxLength: Int) -> UnfoldSequence<SubSequence,Index> {
        sequence(state: startIndex) { start in
            guard start < self.endIndex else { return nil }
            let end = self.index(start, offsetBy: maxLength, limitedBy: self.endIndex) ?? self.endIndex
            defer { start = end }
            return self[start..<end]
        }
    }
}
 

 let kvs = ["key1", "value1", "key2", "value2"]

let dictionary = kvs
    .unfoldSubSequences(limitedTo: 2)
    .reduce(into: [:]) {
        guard $1.count == 2, let key = $1.first, let value = $1.last else { return }
        $0[key] = value
    }
dictionary  // ["key1": "value1", "key2": "value2"]
 

Другой подход с использованием stride. Предполагается, что ваша коллекция имеет четное количество элементов:

 let kvs = ["key1", "value1", "key2", "value2"]

let dictionary = stride(from: 0, to: kvs.count, by: 2)
    .reduce(into: [:]) { $0[kvs[$1]] = kvs[$1 1] }
dictionary  // ["key1": "value1", "key2": "value2"]