Устранение ошибок с помощью пользовательской обработки
Примерчик немного кривоват, но суть от этого не меняется
У нас есть работник станции техобслуживания, который приписан к станции (job), нанят на работу (isOnDuty), имеет или не имеет опыт работы с трансмиссией (boxSpec) и автомобиль с коробкой или без нее пока неизвестного типа. Соответсвенно, чтобы выполнить работу по починке механической коробки передач и выдать бренд масла, которое было использовано при ремонте нужно сделать следующее:
Зачем все это нужно?
Обработка ошибок во время выполнения программы и самое главное — реакция приложения на эти ошибки — это хорошая практика для любого программного продукта. Согласитесь, если вы пользуетесь приложением и в какой-то момент оно без каких либо видимых проявлений «падает», — что вы подумаете про разработчика? Думается — ничего хорошего. А ведь можно в коде добавить обработчики ошибок, и в читабельном формате сообщать пользователю что именно пошло не так. С одной стороны — это значительно повышает юзабилити приложения, с другой облегчает отладку при разработке.
Однако, ошибки не всегда нужно обрабатывать. Языковые функции Swift позволяют избежать некоторых ошибок в целом. Как правило, если вы можете избежать возникновения ошибки, возьмите именно этот путь проектирования и разработки мобильного приложения iOS. Но если вы не можете избежать потенциального условия появления ошибки, то явная обработка — лучший вариант.
В этой статье я составлю памятку по работе с ошибками на языке программирования Swift 3
Избегаем ошибок nil
Так как Swift обладает элегантными опциональными возможностями обработки, вы можете полностью избежать ошибки при попытке извлечь значение из опционала, когда значение в этом самом опционале не представлено.
Быстрый пример — получение элемента из словаря по ключу возвращает опциональное значение. Т.е. если в словаре есть запрошенный ключ — то вернется значение, а если нет — то вернется nil.
Как умный программист, вы можете манипулировать этой функцией, чтобы преднамеренно перевести nil в состояние ошибки. Такой подход выгоден в случае если нужно не вызвать падение программы и при этом ничего не делать если ошибка возникла.
ва типичных примера исключения ошибок Swift с использованием nil — это проваливающиеся инициализаторы и инструкция guard.
Проваливающиеся инициализаторы
Проваливающиеся инициализаторы предотвращают создание объекта, если для их создания не предоставлена достаточная информация. До появления этих инициализаторов в Swift, да и в других языках программирования этот функционал обычно достигался с помощью шаблона Factory Method. Old-school пример создания станции технического обслуживания (СТО) выглядит как метод класса:
Две последних строки нам показывают следующее — станция Audi была создана, т.к. в наших брендах масел мы смоги найти Castrol, а вот kiaStation будет равна nil, т.к. попытка найти масло Zic обернулось неудачей.
То же метод создания мы можем написать при помощи проваливающегося инициализатора. Давайте ЗАМЕНИМ метод create(motorOilBrand:) на код инициализатора:
Также следует изменить строки создания станций.
//
// proSwift.ru
//
// Swift 3
//let audiStation = Stantion.create(with: “Castrol”)
//let kiaStation = Stantion.create(with: “Zic”)
let audiStation = Stantion(brand: “Castrol”)
let kiaStation = Stantion(brand: “Zic”)
То же самое: Ауди — есть объект, Киа — nil.
Инструкция guard
Без долгих рассуждений — сразу к примеру: изменим наш инициализатор при помощи инструкции guard
При этом изменении нет необходимости в переносе else на отдельную строку, и случай сбоя становится более очевидным, так как он теперь находится наверху инициализатора. Более того, код стал более читабелниый и понятный с точки зрения направления чтения (сверху вниз): то что задумывалось разработчиком и должно произойти, если не возникнут ошибки, — описано по ходу текста программы.