#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"]