Превращение индексированного массива в словарь в Swift
Таким образом, я нашел здесь этот метод, но я не понимаю, как его реализовать.
extension Collection {
var indexedDictionary: [Int: Element] {
return enumerated().reduce(into: [:]) { $0[$1.offset] = $1.element }
}
}
при условии, что у меня есть массив строк, таких как
var someArray: [String] = ["String", "String", "String"...etc]
что я хочу быть проиндексирован, в результате чего словарь
[1: "string", 2: "string":..etc]
Используя этот метод, как мне это сделать? Например, где я могу поместить someArray в этот код?
2 ответа
Это расширение:
extension Collection {
var indexedDictionary: [Int: Element] {
return enumerated().reduce(into: [:]) { $0[$1.offset] = $1.element }
}
}
добавляет indexedDictionary
собственность для всех Collection
в Свифте. Массив Collection
, поэтому массивы добавляют это свойство к ним, когда вы добавляете это расширение к исходному файлу Swift на верхнем уровне (не помещайте его внутри другого class
, struct
, или же enum
). Вам нужно только добавить это к одному файлу в вашем проекте, и тогда новое свойство будет доступно в каждом файле.
Тогда вы просто позвоните indexedDictionary
на любой массив в вашем коде, и он возвращает Dictionary
типа [Int : Element]
где Element
представляет тип в вашем исходном массиве. Итак, если ваш массив называется myArray
имеет тип [String]
, затем myArray.indexedDictionary
вернет Dictionary
типа [Int : String]
,
Примеры:
let arr1 = ["a", "b", "c"]
let dict1 = arr1.indexedDictionary
print(dict1)
Выход:
[2: "c", 0: "a", 1: "b"]
// It works with dictionary literals
let dict2 = [5, 10, 15].indexedDictionary
print(dict2)
Выход:
[2: 15, 0: 5, 1: 10]
let arr3: [Any] = [true, 1.2, "hello", 7]
print(arr3.indexedDictionary)
Выход:
[2: "hello", 0: true, 1: 1.2, 3: 7]
Примечание. Словари неупорядочены, поэтому, даже если порядок непредсказуем, сопоставление ключа к значению соответствует ожидаемому.
let result = someArray.reduce([:]) { (dic, val) -> [Int:String] in
let index = someArray.index(of: val)
var mutableDic = dic
mutableDic[index!] = val
return mutableDic
}