Превращение индексированного массива в словарь в Swift - PullRequest
0 голосов
/ 06 июня 2018

Итак, я нашел этот метод для этого, но я точно не понимаю, как его реализовать.

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 ]

0 голосов
/ 06 июня 2018

Это расширение:

extension Collection  {
    var indexedDictionary: [Int: Element] {
        return enumerated().reduce(into: [:]) { $0[$1.offset] = $1.element }
    }
}

добавляет свойство indexedDictionary ко всем Collection s в Swift.Массив имеет значение 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]

Примечание: Словари неупорядочены, поэтому, даже если порядок непредсказуем, сопоставление ключа и значенияэто то, что вы ожидаете.

0 голосов
/ 06 июня 2018
let result = someArray.reduce([:]) { (dic, val) -> [Int:String] in
    let index = someArray.index(of: val)
    var mutableDic = dic
    mutableDic[index!] = val
    return mutableDic
}
...