Превращение индексированного массива в словарь в 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
}
Другие вопросы по тегам