Массив в индексированный словарь в Swift 3

array-to-dictionary_proswift_ru

Расширение для массива

Итак, задачу преобразования массива в словарь мы реализуем с помощью расширения для всего типа коллекции «Массив».

В этом расширении мы создадим свойство indexedDictionary, которое будет типа словарь, с целочисленными ключами и любым типом объектов. Т.е. создавая подобную конструкцию, нам не нужно заботиться о типах элементов массива. Этот тип может быть любым, и наш код будет работать.

//
// proSwift.ru
//


extension Array  {
    var indexedDictionary: [Int: Element] {
        var result: [Int: Element] = [:]
        enumerated().forEach({ result[$0.offset] = $0.element })
        return result
    }
}

Перебирая элементы массива, в итоговый словарь для каждого элемента мы заносим в качестве ключа — смещение по индексу, а в качестве значения — сам элемент. Думаю, по коду все понятно.

Пример

//
// proSwift.ru
//

//: Playground - noun: a place where people can play

extension Array  {
    var indexedDictionary: [Int: Element] {
        var result: [Int: Element] = [:]
        enumerated().forEach({ result[$0.offset] = $0.element })
        return result
    }
}


let cars = ["Audi", "BMW", "Mercedes", "Volvo", "Jaguar", "Subaru", "Lexsus"]

var dict = cars.indexedDictionary

for (key, value) in dict {
    print("В словаре для ключа \(key) имеется значение \(value)")
}

Смотрим на результат работы в консоле:

В словаре для ключа 2 имеется значение Mercedes
В словаре для ключа 4 имеется значение Jaguar
В словаре для ключа 5 имеется значение Subaru
В словаре для ключа 6 имеется значение Lexsus
В словаре для ключа 0 имеется значение Audi
В словаре для ключа 1 имеется значение BMW
В словаре для ключа 3 имеется значение Volvo

Из массива строк получился словарь с целочисленными ключами и значениями — данными из исходного массива. С учетом того, что словарь не гарантирует порядок,  ключи и машины в консоле отобразились в случайном порядке.




Метки:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.