Обновление словарей
Часть раздела Логика и управление потоком путешествия по Swift на Coddy — урок 14 из 56.
Вы записываете данные в словарь так же, как и читаете их: с помощью сабскрипта.
var prices: [String: Int] = ["apple": 1]
prices["bread"] = 3 // добавляет ключ
prices["apple"] = 2 // обновляет существующий ключ
prices["apple"] = nil // удаляет ключДва именованных метода делают то же самое более явно:
prices.updateValue(5, forKey: "milk") // возвращает старое значение или nil
prices.removeValue(forKey: "bread") // возвращает удаленное значение или nilИменованные методы возвращают предыдущее значение, что полезно, когда вам нужно знать, существовал ли ключ ранее.
Паттерн сабскрипта со значением по умолчанию из предыдущего урока отлично сочетается с мутацией; вот как можно создать счетчик, не используя if:
var counts: [String: Int] = [:]
for letter in ["a", "b", "a"] {
counts[letter, default: 0] += 1
}
// counts == ["a": 2, "b": 1]Задание
СреднеПрочитайте одну строку входных данных: список операций над начальным словарем, разделенных запятыми. Каждая операция представляет собой одно из следующих действий:
set:<key>:<value>добавить или обновить (значение является целым числом)add:<key>:<value>прибавить значение к существующему (используйте паттерн default-subscript)del:<key>удалить ключ
После применения каждой операции по порядку к изначально пустому словарю [String: Int], выведите ключи в алфавитном порядке, по одному в строке, в формате <key>=<value>.
Для входных данных set:a:5,add:a:3,set:b:1,del:b,add:c:2 результатом будет:
a=8
c=2Шпаргалка
Измените словарь, используя сабскрипт или именованные методы:
prices["bread"] = 3 // добавить
prices["apple"] = 2 // обновить
prices["apple"] = nil // удалить
prices.updateValue(5, forKey: "milk") // возвращает старое значение или nil
prices.removeValue(forKey: "bread") // возвращает удаленное значение или nilИспользуйте паттерн сабскрипта со значением по умолчанию для изменения без if:
var counts: [String: Int] = [:]
for letter in ["a", "b", "a"] {
counts[letter, default: 0] += 1
}
// counts == ["a": 2, "b": 1]Попробуйте сами
let ops = readLine()!.components(separatedBy: ",")
var dict: [String: Int] = [:]
// TODO: разобрать каждую операцию и применить set/add/del; вывести отсортированные ключи со значениями
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Подсчет и индексыРегистр и удаление пробеловПоиск в строкахРазделение и объединениеЗамена подстрокИтоги — Проверка имени пользователя4Множества
Создание множествОбъединение и пересечениеРазность и симметрическая разностьПодмножество и надмножествоИтоги — Фильтр тегов7Проект — Трекер привычек
Обзор проектаОтметить выполнение10Проект — Движок викторины
Обзор проектаЗадаем вопросы2Диапазоны и шаги
Закрытые и полуоткрытыеШагМетоды диапазоновДиапазоны в SwitchИтоги: Сетка календаря3Словари
Объявление словарейБезопасный поискОбновление словарейИтерация по словарямГруппировка значенийИтоги — Инвентарь6Функции высшего порядка, часть 2
compactMapflatMapsorted(by:)Создание конвейеровПовторение — Таблица лидеров