Массивы, словари и множества

Три базовые коллекции Swift — массив, словарь и множество — покрывают почти все потребности в хранении групп данных.
Суть урока: массив хранит упорядоченный список, словарь — пары ключ-значение, множество — уникальные элементы без порядка. Выбор коллекции определяется тем, как вы будете данные искать и использовать.

Массив (Array) — упорядоченная последовательность элементов одного типа. Доступ по индексу, начиная с нуля:

var tasks: [String] = ["Купить хлеб", "Написать код", "Погулять"]
let first = tasks[0]          // "Купить хлеб"
tasks.append("Поспать")       // добавили в конец
tasks.remove(at: 1)           // удалили второй
print(tasks.count)            // сколько элементов

Словарь (Dictionary) хранит пары ключ-значение. Это как телефонная книжка: по имени находим номер. Доступ по ключу возвращает опционал — ведь ключа может и не быть:

var scores: [String: Int] = ["Анна": 95, "Борис": 88]
scores["Вера"] = 73           // добавили
let annaScore = scores["Анна"]   // Optional(95)
let missing = scores["Глеб"] ?? 0  // 0, ключа нет

Множество (Set) хранит только уникальные элементы и не гарантирует порядок. Идеально для тегов или проверки «есть ли элемент»:

var tags: Set<String> = ["swift", "ios", "swift"]
print(tags.count)             // 2 — дубликат отброшен
print(tags.contains("ios"))   // true, очень быстро
Array  [a, b, c]      порядок ВАЖЕН, дубли можно, доступ по индексу
Dict   [k1:v1, k2:v2]  поиск по ключу, ключи уникальны
Set    {a, b, c}       без порядка, только уникальные, быстрый contains

Попробуй сам ▶ — запусти код прямо в браузере (Pyodide). Здесь нет Swift, но логика та же, что под капотом мобильного кода:

# Те же три коллекции есть и в Python — логика идентична.
tasks = ['Купить хлеб', 'Написать код', 'Погулять']
tasks.append('Поспать')
print('Массив:', tasks, 'длина', len(tasks))

scores = {'Анна': 95, 'Борис': 88}
print('Анна:', scores.get('Анна'))
print('Глеб (нет ключа):', scores.get('Глеб', 0))  # как ?? 0

tags = {'swift', 'ios', 'swift'}   # дубликат исчезнет
print('Множество:', tags, 'есть ios?', 'ios' in tags)

Как работает под капотом

Массив хранит элементы в непрерывном блоке памяти, поэтому доступ по индексу мгновенный, а вставка в середину — дорогая (нужно сдвигать элементы). Словарь и множество используют хеш-таблицу: ключ прогоняется через хеш-функцию, что даёт почти мгновенный поиск, но порядок при этом теряется. Понимание этого помогает выбирать коллекцию под задачу: нужен быстрый поиск по идентификатору — берите словарь, нужна проверка членства — множество.

Частые ошибки

  • Выход за границы массива. Обращение к tasks[10], когда элементов меньше, уронит приложение. Проверяйте indices или используйте безопасный доступ.
  • Забыть, что словарь возвращает опционал. scores["X"] — это Int?, не Int.
  • Ожидать порядок от Set. Множество не сохраняет порядок добавления.

Best practices

  • Объявляйте коллекцию через let, если она не будет меняться — это и оптимизация, и защита.
  • Для уникальных значений и быстрых проверок берите Set, а не массив с ручной проверкой дублей.
  • Используйте ?? при доступе к словарю, чтобы задать значение по умолчанию.

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

Шире контекста

Выбор коллекции — это маленькое архитектурное решение, которое аукнется на производительности. Если вы тысячу раз проверяете «есть ли элемент в наборе» на массиве, каждый раз перебирая его целиком, приложение начнёт тормозить на больших данных; то же самое на множестве отработает мгновенно благодаря хеш-таблице. Если вам нужно по идентификатору товара быстро найти его описание — словарь избавит от линейного поиска. А когда важен именно порядок (лента сообщений, список шагов рецепта) — ваш выбор массив. В реальных приложениях коллекции часто комбинируют: массив моделей для отображения списка плюс множество выбранных идентификаторов для отметки галочками. Понимание характеристик каждой структуры — упорядоченность, уникальность, скорость поиска — позволяет проектировать данные так, чтобы интерфейс оставался отзывчивым даже на тысячах элементов.

Проверьте себя
1. Что вернёт обращение scores["Анна"], где scores имеет тип [String: Int]?
AInt
BInt?
CString
DОшибку компиляции
2. Какую коллекцию выбрать для хранения уникальных тегов с быстрой проверкой наличия?
AArray
BDictionary
CSet
DString