try? и try!
Часть раздела Логика и управление потоком путешествия по Swift на Coddy. Урок 46 из 56.
Иногда вам не важно, какую ошибку выдала функция, — вам просто нужен результат или запасной вариант. Swift предоставляет две краткие формы.
try? превращает любую выброшенную ошибку в nil. Результатом является Optional типа, возвращаемого функцией:
enum E: Error { case nope }
func risky() throws -> Int { throw E.nope }
let result = try? risky() // nil
let safe = (try? risky()) ?? 0 // 0Используй его вместе с ?? для встроенного значения по умолчанию. Это самая короткая версия фразы «вызови эту штуку и в любом случае дай мне значение».
try! означает: «Я знаю, что это не вызовет исключение». Если это всё же произойдёт, ваша программа завершится с ошибкой. Используйте его только тогда, когда можете доказать, что вызов безопасен; в обычном коде предпочитайте try? с запасным вариантом или полную конструкцию do/catch.
Задание
ЛегкоОпредели NumError: Error с одним случаем bad. Определи выбрасывающую ошибку parseEven(_ s: String) throws -> Int, которая:
- выбрасывает
.bad, еслиsнельзя преобразовать вIntили если полученное значение нечётное; - в противном случае возвращает полученное целое число.
Считай одну строку ввода: список строк, разделённых запятыми. Для каждой из них используй try?, за которым следует ?? -1, чтобы получить либо преобразованное чётное целое число, либо -1.
Выведи по порядку полученные целые числа, объединённые с помощью ,. Затем во второй строке выведи количество значений, которые оказались равны -1.
Для ввода 4,7,abc,8,11,2 результатом будет:
4,-1,-1,8,-1,2
3Попробуйте сами
let parts = readLine()!.components(separatedBy: ",")
// TODO: enum NumError; func parseEven(_:) throws -> Int;
// для каждой part, (try? parseEven(part)) ?? -1
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Подсчет и индексыРегистр и удаление пробеловПоиск в строкахРазделение и объединениеЗамена подстрокИтоги — Проверка имени пользователя4Множества
Создание множествОбъединение и пересечениеРазность и симметрическая разностьПодмножество и надмножествоИтоги — Фильтр тегов7Проект — Трекер привычек
Обзор проектаОтметить выполнение10Проект — Движок викторины
Обзор проектаЗадаем вопросы2Диапазоны и шаги
Закрытые и полуоткрытыеШагМетоды диапазоновДиапазоны в SwitchИтоги: Сетка календаря3Словари
Объявление словарейБезопасный поискОбновление словарейИтерация по словарямГруппировка значенийИтоги — Инвентарь6Функции высшего порядка, часть 2
compactMapflatMapsorted(by:)Создание конвейеровПовторение — Таблица лидеров9Обработка ошибок
throws и Errordo, try, catchtry? и try!Проброс ошибокПовторение — Безопасный калькуляторПотренируйтесь самостоятельно: Песочница Swift