Каковы основные характеристики, преимущества и недостатки коллекций Array, Set и Dictionary в Swift?

«Каковы основные характеристики, преимущества и недостатки коллекций Array, Set и Dictionary в Swift?» — вопрос из категории Алгоритмы и структуры данных, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Array<Element> (Массив)

  • Характеристики: Упорядоченная коллекция, допускает дубликаты. Индексация начинается с 0.
  • Преимущества: Константное время доступа по индексу — O(1). Эффективные операции в конце (append/popLast — амортизированное O(1)).
  • Недостатки: Вставка или удаление элемента в середину требует сдвига всех последующих элементов — O(n).

Set<Element> (Множество)

  • Характеристики: Неупорядоченная коллекция уникальных элементов. Тип Element должен соответствовать Hashable.
  • Преимущества: Константное в среднем время проверки наличия элемента (contains), добавления и удаления — O(1). Гарантирует уникальность.
  • Недостатки: Нет понятия порядка или индекса. Нет гарантий на производительность в худшем случае (может деградировать до O(n)).

Dictionary<Key, Value> (Словарь)

  • Характеристики: Неупорядоченная коллекция пар ключ-значение. Ключи уникальны и должны быть Hashable.
  • Преимущества: Константное в среднем время доступа к значению по ключу — O(1). Идеален для ассоциативного поиска.
  • Недостатки: Нет порядка (до Swift 4; в современных версиях порядок вставки сохраняется, но не стоит на него полагаться для логики). Избыточен, если нужен просто список.

Практические примеры выбора:

// 1. Задача: Отобразить ленту новостей в порядке публикации.
// Выбор: Array. Порядок важен.
let newsFeed: [NewsItem] = [item1, item2, item3] // item1 будет первым.

// 2. Задача: Хранить уникальные ID избранных товаров для быстрой проверки.
// Выбор: Set. Уникальность и быстрый поиск важны, порядок — нет.
var favoriteProductIDs: Set<String> = ["id123", "id456"]
if favoriteProductIDs.contains("id123") { // O(1)
    print("Товар в избранном")
}

// 3. Задача: Кэшировать загруженные изображения по URL.
// Выбор: Dictionary. Быстрый доступ к данным (изображению) по ключу (URL).
var imageCache: [URL: UIImage] = [:]
if let cachedImage = imageCache[imageURL] { // O(1)
    imageView.image = cachedImage
}