Ответ
Dictionary (словарь) в Swift — это универсальная неупорядоченная коллекция, которая хранит пары ключ-значение. Каждый ключ в словаре уникален и используется для поиска соответствующего значения.
Ключевые характеристики:
- Тип:
Dictionary<Key, Value>или краткая форма[Key: Value]. - Уникальность ключей: Все ключи должны быть уникальными. Попытка вставить значение с существующим ключом перезаписывает старое значение.
- Производительность: Доступ к значению по ключу в среднем выполняется за время O(1), благодаря внутренней реализации на основе хеш-таблицы.
- Порядок: Элементы не имеют гарантированного порядка. Начиная с Swift 5, порядок вставки сохраняется как деталь реализации, но на это не следует полагаться для логики программы.
Требования к ключу: Тип ключа (Key) должен соответствовать протоколу Hashable (например, String, Int, Double, Bool или пользовательские типы).
Базовые операции:
// Создание
var capitals: [String: String] = ["Франция": "Париж", "Япония": "Токио"]
// Добавление или изменение значения
capitals["Германия"] = "Берлин" // Добавление
capitals["Япония"] = "Киото" // Изменение существующего
// Получение значения (возвращает Optional)
let paris = capitals["Франция"] // String?
if let tokyo = capitals["Япония"] {
print(tokyo) // "Киото"
}
// Удаление
capitals["Германия"] = nil
let removedValue = capitals.removeValue(forKey: "Франция")
// Итерация
for (country, capital) in capitals {
print("(country): (capital)")
}
Важные методы и свойства:
isEmpty,count— проверка на пустоту и количество элементов.keys,values— коллекции всех ключей и значений.updateValue(_:forKey:)— устанавливает значение и возвращает старое (если было).removeAll()— очистка словаря.
Иммутабельность: Словарь, объявленный через let, является неизменяемым (нельзя добавлять, удалять или изменять элементы).
Ответ 18+ 🔞
О, так, словари в Swift, да? Ну, это ж типа как твоя записная книжка, где ты ищешь не по страницам, а по имени, блядь. Забыл номер телефона Петровича? Не надо листать всю хуйню — тыкнул в «Петрович» и сразу «+7-xxx-xxx-xx-xx». Вот и вся магия, ёпта.
Что это за зверь?
По-умному это Dictionary<Key, Value>, но все нормальные люди пишут [Key: Value]. Представь два столбика: слева — уникальные ключи (как имена в твоей книжке), справа — значения (как сами номера). И главное правило, блядь: ключи не повторяются! Попробуй записать двух разных Петровичей под одним именем — второй просто сотрёт первого, как будто его и не было. Жестоко, но справедливо.
А что можно в ключи тыкать?
Любой тип, который умеет в Hashable. Это такой протокол, который говорит: «Я, блядь, могу превратиться в уникальную цифровую подпись». String, Int, Bool — они все такие. Свои типы тоже можно запилить, но это уже отдельная история, проще пока не лезть.
Скорость? О, это самое сокровенное! Поиск по ключу — в среднем O(1), то есть почти мгновенно, потому что внутри это хитрая хеш-таблица, а не простой список. Не надо перебирать всё, как дураку.
Порядок? А вот с порядком — пиздец. Не упорядоченная она, коллекция. Хотя, если честно, со Swift 5 они там что-то подкрутили, и порядок вставки вроде как сохраняется... Но рассчитывать на это — всё равно что надеяться, что автобус приедет по расписанию. Не надо так.
Давай уже на практике, надоело слушать!
// Рождаем словарь. Допустим, столицы.
var capitals = ["Франция": "Париж", "Япония": "Токио"] // Краткая запись, красота!
// Хочу добавить Германию. Проще некуда:
capitals["Германия"] = "Берлин" // Всё, добавил.
// Ой, а Япония-то не Токио, а Киото! (Шутка, но для примера сойдёт)
capitals["Япония"] = "Киото" // Старое значение "Токио" просто накрылось медным тазом. Прощай.
// А где мне взять столицу Франции?
let maybeParis = capitals["Франция"] // А вот тут, сука, сюрприз! Тип `String?`, опционал!
// Потому что ключа может и не быть в словаре. Надо распаковывать.
if let paris = maybeParis {
print("Столица Франции — (paris)") // Выведет "Париж"
}
// Удалить что-нибудь? Легко!
capitals["Германия"] = nil // Просто присвоил nil по ключу — и нет Германии.
// Или так, с возвратом старого значения:
let deletedCapital = capitals.removeValue(forKey: "Франция") // Вернёт "Париж" или nil
// Пройтись по всем, как по магазину:
for (country, city) in capitals {
print("(country): (city)") // Напечатает оставшиеся пары
}
Ещё немного полезной хуйни:
capitals.isEmpty— пустой словарь или нет. Быстрая проверка.capitals.count— сколько там пар ключ-значение валяется.capitals.keys— получишь коллекцию всех ключей.capitals.values— соответственно, всех значений.capitals.updateValue("Мадрид", forKey: "Испания")— Умный метод. Добавит «Испанию» или обновит, если уже есть, и вернёт старое значение, если оно было. Удобно иногда.capitals.removeAll()— Ну тут всё ясно, чистильщик. Оставляет пустое место.
И главное напоследок, блядь!
Объявил через let — и всё, пиши пропало. Неизменяемый словарь. Ни добавить, ни удалить, ни изменить. Сиди и смотри на него, как на музейный экспонат.
Вот и вся наука. Не так страшен чёрт, как его малюют. Главное — ключи уникальные делай и помни про опционалы, когда достаёшь значения. А то будешь потом удивляться, почему nil вылезает, а ядрёна вошь!