Какие основные типы стандартных коллекций есть в Swift и как записываются их типы?

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

Ответ

Swift предоставляет три основные универсальные (generic) коллекции, каждая со своей семантикой и синтаксисом типа:

Коллекция Назначение Синтаксис типа (полный / краткий) Пример инициализации
Array Упорядоченная коллекция с индексами. Array<Element> или [Element] let numbers: [Int] = [1, 2, 3]
Set Неупорядоченная коллекция уникальных значений. Set<Element> let tags: Set<String> = ["swift", "ios", "apple"]
Dictionary Неупорядоченная коллекция пар ключ-значение. Dictionary<Key, Value> или [Key: Value] let capitals: [String: String] = ["FR": "Paris"]

Ключевые технические детали:

  1. Value-семантика: Все три коллекции являются типами-значениями. При присваивании или передаче в функцию копируется их содержимое (с оптимизацией COW — Copy-on-Write).
  2. Соответствие протоколам: Все они соответствуют протоколу Collection, который обеспечивает базовый интерфейс для итерации.
    • Array также соответствует RandomAccessCollection (быстрый доступ по индексу).
    • Set соответствует SetAlgebra для операций вроде объединения и пересечения.
  3. Ограничения типов:
    • Тип Element для Set должен соответствовать протоколу Hashable.
    • Тип Key для Dictionary также должен быть Hashable.

Пример использования с дженериками:

// Функция, работающая с любой коллекцией, содержащей целые числа
func sumOfElements<C: Collection>(_ collection: C) -> Int where C.Element == Int {
    return collection.reduce(0, +)
}

let arr: [Int] = [1, 2, 3]
let set: Set<Int> = [4, 5, 6]

print(sumOfElements(arr)) // 6
print(sumOfElements(set)) // 15