Безопасный поиск
Часть раздела Логика и управление потоком путешествия по Swift на Coddy — урок 13 из 56.
Обращение к словарю по ключу всегда возвращает Optional: значение, если ключ существует, и nil, если нет. Swift заставляет вас обрабатывать оба случая.
let prices: [String: Int] = ["apple": 1, "bread": 3]
let p = prices["apple"]
print(p) // Optional(1)Три идиоматичных способа работы с optional. Выберите тот, который лучше всего подходит для конкретной ситуации.
1. if let: явно обрабатывайте обе ветви:
if let p = prices["apple"] {
print("apple costs \(p)")
} else {
print("unknown")
}2. nil-coalescing ??: укажите резервное значение прямо в строке:
let p = prices["olive"] ?? 0 // 03. сабскрипт со значением по умолчанию: идентичный результат, но значение по умолчанию также сохраняется, если вы записываете данные обратно по этому ключу:
var counts = ["a": 2]
counts["b", default: 0] += 1 // counts == ["a": 2, "b": 1]Задание
ЛегкоДан словарь prices. Прочитайте одну строку ввода: список товаров, которые пользователь хочет купить, разделенных запятыми.
Для каждого товара, в порядке ввода, найдите его в prices. Выведите по одной строке для каждого товара:
<item> @ <price>, если товар есть в словаре<item> not soldв противном случае
После перечисления всех товаров выведите финальную строку: Total: <sum>. Считайте стоимость отсутствующих товаров равной 0, используя оператор nil-coalescing.
Для ввода apple,bread,olive,milk вывод будет следующим:
apple @ 1
bread @ 3
olive not sold
milk @ 4
Total: 8Шпаргалка
Сабскрипты словаря возвращают Optional — значение, если ключ существует, и nil, если нет.
1. if let — обработка обеих ветвей:
if let p = prices["apple"] {
print("apple costs \(p)")
} else {
print("unknown")
}2. Оператор объединения с nil ?? — предоставление резервного значения:
let p = prices["olive"] ?? 0 // 03. Сабскрипт со значением по умолчанию — резервное значение, которое также работает при записи:
var counts = ["a": 2]
counts["b", default: 0] += 1 // ["a": 2, "b": 1]Попробуйте сами
let prices: [String: Int] = ["apple": 1, "bread": 3, "milk": 4]
let items = readLine()!.components(separatedBy: ",")
// TODO: поиск по каждому товару; вывести '@ цена' или 'не продается'; суммировать с использованием ?? 0
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Подсчет и индексыРегистр и удаление пробеловПоиск в строкахРазделение и объединениеЗамена подстрокИтоги — Проверка имени пользователя4Множества
Создание множествОбъединение и пересечениеРазность и симметрическая разностьПодмножество и надмножествоИтоги — Фильтр тегов7Проект — Трекер привычек
Обзор проектаОтметить выполнение10Проект — Движок викторины
Обзор проектаЗадаем вопросы2Диапазоны и шаги
Закрытые и полуоткрытыеШагМетоды диапазоновДиапазоны в SwitchИтоги: Сетка календаря3Словари
Объявление словарейБезопасный поискОбновление словарейИтерация по словарямГруппировка значенийИтоги — Инвентарь6Функции высшего порядка, часть 2
compactMapflatMapsorted(by:)Создание конвейеровПовторение — Таблица лидеров