Menu
Coddy logo textTech

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.

challenge icon

Задание

Легко

Определи 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
quiz iconПроверьте себя

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

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

Потренируйтесь самостоятельно: Песочница Swift