Массивы, словари и множества
Три базовые коллекции 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, а не массив с ручной проверкой дублей.
- Используйте ?? при доступе к словарю, чтобы задать значение по умолчанию.
Итоги. Массив, словарь и множество — три кита хранения данных. Массив для упорядоченных списков, словарь для поиска по ключу, множество для уникальности. Правильный выбор делает код быстрым и читаемым.
Шире контекста
Выбор коллекции — это маленькое архитектурное решение, которое аукнется на производительности. Если вы тысячу раз проверяете «есть ли элемент в наборе» на массиве, каждый раз перебирая его целиком, приложение начнёт тормозить на больших данных; то же самое на множестве отработает мгновенно благодаря хеш-таблице. Если вам нужно по идентификатору товара быстро найти его описание — словарь избавит от линейного поиска. А когда важен именно порядок (лента сообщений, список шагов рецепта) — ваш выбор массив. В реальных приложениях коллекции часто комбинируют: массив моделей для отображения списка плюс множество выбранных идентификаторов для отметки галочками. Понимание характеристик каждой структуры — упорядоченность, уникальность, скорость поиска — позволяет проектировать данные так, чтобы интерфейс оставался отзывчивым даже на тысячах элементов.