🍎 Swift

القواميس وجداول التجزئة في 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() — удаляет все элементы

Словари — мощный инструмент для хранения связанных данных. Они помогают быстро находить информацию по ключу и делают код понятным. Попробуй решить задачи из раздела — и ты быстро освоишь эту тему!