В чем разница между основными типами коллекций в Swift: Array, Set и Dictionary?

Ответ

Swift предоставляет три фундаментальных типа коллекций, каждый оптимизирован для своих задач.

1. Array (Массив)

  • Упорядоченная коллекция элементов.
  • Доступ по целочисленному индексу (array[0]).
  • Допускает дубликаты значений.
  • Порядок вставки сохраняется.
var fruits: [String] = ["Apple", "Banana", "Apple"] // Дубликаты разрешены
fruits.append("Orange") // Добавление в конец
let firstFruit = fruits[0] // Доступ по индексу: "Apple"

Сложность операций:

  • Доступ по индексу – O(1).
  • Поиск элемента – O(n).
  • Вставка в начало/середину – O(n).

2. Set (Множество)

  • Неупорядоченная коллекция уникальных элементов.
  • Гарантирует, что каждый элемент присутствует только один раз.
  • Очень быстрый поиск (O(1) в среднем), так как основан на хэш-таблице.
  • Реализует математические операции (объединение, пересечение).
var uniqueNumbers: Set<Int> = [1, 2, 3, 1] // Фактически [1, 2, 3]
uniqueNumbers.insert(4)
if uniqueNumbers.contains(2) { // Быстрый поиск
    print("Найдено!")
}

3. Dictionary (Словарь)

  • Неупорядоченная коллекция пар ключ-значение.
  • Ключи должны быть уникальными и хэшируемыми (Hashable).
  • Оптимизирован для поиска значения по ключу (O(1) в среднем).
var scores: [String: Int] = ["Alice": 10, "Bob": 15]
scores["Charlie"] = 12 // Добавление
let bobScore = scores["Bob"] // 15 (быстрый доступ по ключу)

Сводная таблица

Коллекция Порядок Уникальность Ключевая операция
Array Сохраняется Дубликаты разрешены Доступ по индексу
Set Не гарантирован Все элементы уникальны Проверка принадлежности (contains)
Dictionary Не гарантирован Ключи уникальны Доступ по ключу

Почему это важно? Правильный выбор коллекции напрямую влияет на производительность и читаемость кода. Используйте Array для упорядоченных списков, Set для проверки уникальности и быстрого поиска, Dictionary для ассоциативного хранения данных.

Ответ 18+ 🔞

А, слушай, вот эта вся хуйня про коллекции в Swift — это, блядь, как три разных инструмента в гараже. Один — молоток, другой — шуруповёрт, третий — разводной ключ. И если ты будешь гвозди шуруповёртом забивать, то, блядь, и гвоздь сломаешь, и инструмент угробишь. Пиздец.

Вот смотри, есть три штуки, и каждая для своего дела.

1. Array (Массив, он же список, он же просто "пачка")

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

var продукты: [String] = ["Хлеб", "Молоко", "Хлеб"] // Два хлеба, и нихуя не случилось
продукты.append("Колбаса") // Сунул в конец очереди
let первыйВОчереди = продукты[0] // Спрашиваешь: "Кто первый?" — "Хлеб". Всё просто, O(1), блядь.

Но вот где пиздец: если ты захочешь впендюрить нового человека в начало этой очереди, то всем придётся, блядь, сдвинуться на шаг назад. Это O(n), то есть чем очередь длиннее, тем дольше все будут переобуваться. Вставка в середину — та же хуйня.

2. Set (Множество, он же "мешок с уникальным дерьмом")

А это уже не очередь. Это как, блядь, коробка с разноцветными шариками. Ты её трясёшь — порядок меняется, него хуя не понятно. Но главное правило: одинаковых шариков быть не может. Два красных? Нахуй! Один красный, и всё.

var уникальныеЧисла: Set<Int> = [1, 2, 3, 1] // Попробовал сунуть две единицы
print(уникальныеЧисла) // [2, 3, 1] или [1, 3, 2] — порядок ёбнут, дубликата нет!
if уникальныеЧисла.contains(2) { // И вот тут магия, О(1) в среднем!
    print("Нашёл, сука!") // Ищет не перебирая всё, а по хэшу, как умный.
}

Идеален, когда тебе надо быстро ответить на вопрос: "А этот пидор уже в списке?" или "Какие уникальные элементы есть?".

3. Dictionary (Словарь, он же "паспортный стол")

Это, блядь, самый полезный инструмент. У тебя есть ключ (например, имя) и значение (например, оценка за тест). Порядок — похуй. Главное, чтобы ключи не повторялись. Не может быть двух записей на "Васю Пупкина", иначе пиздец.

var оценки: [String: Int] = ["Анна": 5, "Борис": 2]
оценки["Владимир"] = 4 // Добавил новую пару
let оценкаБориса = оценки["Борис"] // Спросил по ключу — мгновенно получил "2". O(1), ёпта!

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

Короче, сводка для тех, кто в танке

Коллекция Порядок Повторы? Зачем нужна?
Array Да, свято блюдёт Да, хоть трижды Когда важен порядок и индекс. Очередь, список.
Set Нет, ёбнут Нет, нахуй Когда важна уникальность и быстрый поиск "есть ли?".
Dictionary Нет, похуй Ключи — нет Когда нужно хранить пары "ключ → значение" и быстро искать по ключу.

Итог, блядь: Не будь мудаком. Если тебе нужен просто список по порядку — бери Array. Если нужно проверить, был ли пользователь в системе — Set. Если нужно хранить данные по id или имени — Dictionary. Выбирай инструмент по задаче, а не потому что "массивом привычнее", а то получишь O(n) там, где могло быть O(1), и потом будешь ебаться с оптимизацией, как дурак.