Когда использовать словарь (Dictionary) в Swift?

Ответ

Словарь (Dictionary) в Swift используется для хранения неупорядоченных коллекций пар ключ-значение, где каждый ключ уникален. Основные сценарии применения:

  • Быстрый поиск по ключу. Доступ к значению по ключу в среднем выполняется за O(1).
  • Моделирование ассоциативных данных. Например, хранение настроек пользователя, параметров запроса или свойств объекта.
  • Группировка данных. Объединение элементов по общему признаку (ключу).
  • Подсчет частоты элементов. Ключ — элемент, значение — количество его вхождений.

Пример:

var capitals = ["Россия": "Москва", "Франция": "Париж"]
// Добавление
capitals["Япония"] = "Токио"
// Быстрый доступ
if let russianCapital = capitals["Россия"] {
    print(russianCapital) // Москва
}

Ключевые ограничения и best practices:

  • Тип ключа должен соответствовать протоколу Hashable.
  • Порядок элементов не гарантирован (до Swift 4). Для сохранения порядка добавления используйте OrderedDictionary из сторонних библиотек или iOS 15+.
  • Не подходит, если важен порядок элементов или нужны дублирующиеся ключи.
  • Используйте compactMapValues, mapValues для безопасных преобразований.

Ответ 18+ 🔞

Ну, слушай, вот есть у тебя в жизни такая штука, как словарь. Ну, не тот, где "мама" и "рама", а в Swift, блядь. Это типа как твоя записная книжка, где на против фамилии "Петров" написано "должен 500 рублей". Главное, чтобы фамилия была одна, а то потом нихуя не разберёшь, кто кому и сколько.

Вот зачем это, спросишь? А вот зачем, ёпта:

  • Найти что-то по ключу — быстрее, чем ты успеешь сказать "ёперный театр". O(1), блядь, почти мгновенно. Спросил по ключу — получил значение. Не надо, как в массиве, весь список перебирать.
  • Связать одно с другим, как водку с закуской. Настройки пользователя? Ключ — "theme", значение — "dark". Параметры запроса на сервер? Да та же хуйня.
  • Сгруппировать что попало. Всех "Васьков" в один список, всех "Мурок" — в другой. Ключ — имя, значение — стая этих Васьков.
  • Посчитать, сколько раз эта блядская ошибка вылезала. Ключ — текст ошибки, значение — счётчик. Становится ясно, на ком свет клином сошёлся.

Вот, смотри, как это выглядит в коде, сука:

var capitals = ["Россия": "Москва", "Франция": "Париж"]
// Добавим ещё
capitals["Япония"] = "Токио"
// А теперь быстро-быстро спросим
if let russianCapital = capitals["Россия"] {
    print(russianCapital) // Москва
}

А теперь, внимание, ебаные подводные камни, чтобы не обосраться:

  • Ключ должен быть Hashable. Это как требование, чтобы у всех фамилий в твоей записной книжке был уникальный почерк. String, Int — проходят, а вот какая-нибудь твоя кривая структура — уже нет, пока не научишь.
  • Порядок — это пиздёж. Не надейся, что они там лежат так, как ты их засунул. Если порядок критичен — это тебе не сюда, иди в OrderedDictionary (библиотеки или iOS 15+).
  • Два одинаковых ключа — нихуя. Как две одинаковые фамилии в книжке. Второй просто перетрёт долг за первым. Если нужны повторы — это массив пар, а не словарь.
  • Работай с умом. Есть compactMapValues, mapValues — используй их для преобразований, а не выёбывайся со своими for циклами, где на ровном месте можно словить nil и обосраться.