Menu
Coddy logo textTech

Обновление словарей

Часть раздела Логика и управление потоком путешествия по 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]
challenge icon

Задание

Средне

Прочитайте одну строку входных данных: список операций над начальным словарем, разделенных запятыми. Каждая операция представляет собой одно из следующих действий:

  • 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; вывести отсортированные ключи со значениями
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком