القواميس وجداول التجزئة في Swift 5.9: دليل شامل
Словари и хеш-таблицы в Swift
Что такое словарь? Зачем он нужен?
Представь, что у тебя есть рюкзак, в котором лежат вещи. Чтобы быстро найти нужную вещь, ты наклеиваешь на каждую ярлычок: «ключи», «телефон», «наушники». Словарь в программировании работает так же: у него есть ключи (ярлычки) и значения (сами вещи).
Словари помогают хранить пары «ключ — значение». Например, «имя друга» → «номер телефона» или «название страны» → «приветствие на её языке». В Swift такой тип данных называется Dictionary.
Основной синтаксис
Создать словарь можно двумя способами:
// Пустой словарь
var пустойСловарь: [String: Int] = [:]
// Словарь с данными
var приветствия: [String: String] = [
"Россия": "Привет",
"Англия": "Hello",
"Франция": "Bonjour"
]
Тип словаря записывается как [Ключ: Значение]. Ключи должны быть уникальными, значения могут повторяться.
Основные действия со словарём
- Добавить или изменить элемент:
словарь[ключ] = значение - Получить значение по ключу:
словарь[ключ](возвращает опциональное значение) - Удалить элемент:
словарь.removeValue(forKey: ключ)илисловарь[ключ] = nil - Проверить наличие ключа:
словарь.keys.contains(ключ) - Количество элементов:
словарь.count
Пример: Приветствие для путешественника
Создадим словарь с приветствиями и спросим у пользователя страну:
import Foundation
var приветствия = [
"Россия": "Привет",
"Англия": "Hello",
"Франция": "Bonjour",
"Испания": "Hola"
]
print("Введите название страны:")
if let страна = readLine() {
if let приветствие = приветствия[страна] {
print("В \(страна) говорят: \(приветствие)")
} else {
print("Извините, такой страны нет в словаре.")
}
}
Пример: Телефонный справочник
import Foundation
var справочник = [
"Анна": "+7-912-345-67-89",
"Петр": "+7-923-456-78-90",
"Мария": "+7-934-567-89-01"
]
print("Введите имя для поиска:")
if let имя = readLine() {
if let номер = справочник[имя] {
print("Номер телефона \(имя): \(номер)")
} else {
print("Контакт не найден.")
}
}
Пример: Книжная карточка (план на неделю)
import Foundation
var планНаНеделю: [String: [String]] = [:]
планНаНеделю["Понедельник"] = ["Купить продукты", "Позвонить врачу"]
планНаНеделю["Вторник"] = ["Сходить в библиотеку", "Приготовить ужин"]
print("Введите день недели:")
if let день = readLine() {
if let дела = планНаНеделю[день] {
print("Дела на \(день):")
for дело in дела {
print("- \(дело)")
}
} else {
print("На этот день дел нет.")
}
}
Пример: Цифровой блокнот (удаление контакта)
import Foundation
var блокнот = [
"Иван": "+7-900-111-22-33",
"Ольга": "+7-900-444-55-66",
"Сергей": "+7-900-777-88-99"
]
print("Введите имя для удаления:")
if let имя = readLine() {
if let удалённый = блокнот.removeValue(forKey: имя) {
print("Контакт \(имя) с номером \(удалённый) удалён.")
} else {
print("Такого контакта нет.")
}
print("Осталось контактов: \(блокнот.count)")
}
Пример: Ключи словаря (список товаров)
import Foundation
var товары = [
"Хлеб": 45,
"Молоко": 80,
"Яблоки": 120,
"Сыр": 250
]
print("Список товаров в магазине:")
for (название, цена) in товары {
print("\(название): \(цена) руб.")
}
Частые ошибки новичков
- Забыть, что значение по ключу — опциональное. Если ключа нет, словарь вернёт
nil. Всегда проверяй черезif letили используй значение по умолчанию. - Попытка использовать одинаковые ключи. В словаре не может быть двух одинаковых ключей — новое значение перезапишет старое.
- Путать ключи и значения. Ключи — это «ярлычки», по которым мы ищем. Значения — это то, что мы храним.
- Не указывать тип словаря. Swift сам может определить тип, но лучше всегда явно указывать:
[String: Int].
Итоговый пример: Словарь переводов
Создадим программу, которая помогает переводить слова с английского на русский. Пользователь вводит английское слово, программа выводит перевод.
import Foundation
var словарь: [String: String] = [
"apple": "яблоко",
"book": "книга",
"cat": "кот",
"dog": "собака",
"house": "дом"
]
print("Добро пожаловать в переводчик!")
print("Введите английское слово (или 'выход' для завершения):")
while true {
if let ввод = readLine()?.lowercased() {
if ввод == "выход" {
print("До свидания!")
break
}
if let перевод = словарь[ввод] {
print("Перевод: \(перевод)")
} else {
print("Слово не найдено. Хотите добавить его? (да/нет)")
if let ответ = readLine()?.lowercased(), ответ == "да" {
print("Введите перевод:")
if let новыйПеревод = readLine() {
словарь[ввод] = новыйПеревод
print("Слово добавлено!")
}
}
}
}
}
Как работают хеш-таблицы под капотом
Словари в Swift основаны на хеш-таблицах. Когда ты добавляешь пару «ключ — значение», компьютер превращает ключ в число (хеш) с помощью специальной функции. Это число определяет, в какую «ячейку» памяти положить значение. Поэтому поиск по ключу происходит очень быстро — почти мгновенно, даже если в словаре миллион элементов.
Чтобы ключ можно было использовать в словаре, он должен поддерживать протокол Hashable. Все базовые типы (строки, числа) уже поддерживают его.
Полезные методы словарей
словарь.isEmpty— проверяет, пуст ли словарьсловарь.keys— все ключи словарясловарь.values— все значения словарясловарь.updateValue(новое, forKey: ключ)— обновляет значение и возвращает староесловарь.removeAll()— удаляет все элементы
Словари — мощный инструмент для хранения связанных данных. Они помогают быстро находить информацию по ключу и делают код понятным. Попробуй решить задачи из раздела — и ты быстро освоишь эту тему!