Connect with us

Программирование

Optional в Swift: 5 вещей, которые вы должны знать

Опубликовано

/

     
     

Optional лежат в основе Swift и существуют с первой версии языка. Опциональное значение позволяет нам писать чистый код и в то же время заботиться о возможных значениях nil.

Если вы новичок в Swift, вам следует привыкнуть к синтаксису добавления вопросительного знака к свойствам. Как только вы сделаете это, вы сможете начать извлекать из них пользу, например, с помощью расширений (extensions).

Что такое optional значение в Swift?

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

Свойства, методы и субскрипты могут возвращать опциональные значения, что в основном означает, что они либо возвращают значение, если оно существует, либо nil. Несколько запросов можно объединить в цепочку, что называется Optional chaining. Это альтернатива принудительному разворачиванию, о котором более подробно будет рассказано далее.

Следующий пример кода определяет optional String и использует цепочку для вывода количества символов.

Обратите внимание: оператор ?? (оператор объединения нулей) будет рассмотрен позже.

1. Принудительное разворачивание optional в Swift

Принудительное разворачивание либо возвращает значение, если оно существует, либо вызывает runtime ошибку, если значение равно nil.

Но прежде чем мы погрузимся в принудительное разворачивание, давайте сначала рассмотрим возможности разворачивания без принуждения.

Как развернуть optional?

В Swift есть несколько способов развернуть значение. Вы можете использовать оператор guard:

Или вы можете использовать оператор if let:

А начиная с SE-0345, мы также можем использовать сокращенный синтаксис для разворачивания одноименных свойств:

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

Принудительное разворачивание с помощью восклицательного знака (!)

Опциональное значение можно принудительно развернуть, используя восклицательный знак (!) непосредственно после значения:

Если переменная name в приведенном выше примере будет установлена в nil, это приведет к фатальной ошибке во время выполнения, как показано ниже:

Fatal error: Unexpectedly found nil while unwrapping an Optional value

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

Развертки можно объединить в цепочку

Optional цепочка может быть выполнена следующим образом:

То же самое относится и к принудительному разворачиванию:

Но имейте в виду, что если вы развернете только последний optional элемент, то в итоге все равно получите optional. В следующем примере мы разворачиваем только title, но не post. Это означает, что если пост равен nil, то мы все равно не получим обратно заголовок:

Optional как лучшая практика — принудительное разворачивание для выявления ошибок

Лучшая практика — не использовать восклицательный знак, если он не нужен. Некоторые даже рекомендуют включить правило принудительного разворачивания SwiftLint. Это предотвратит появление множества неожиданных сбоев.

Однако некоторые разработчики предпочитают использовать принудительное разворачивание для ошибок, когда значение равно nil. Таким образом, вы можете помочь себе в отладке, используя принудительное разворачивание, и поймать ошибку на ранней стадии. Я предпочитаю вообще не использовать принудительное разворачивание.

2. Optional — это перечисление из двух случаев

Полезно знать, что optional — это, по сути, перечисление двух случаев:

Однако вместо .none вы можете использовать nil, чтобы указать на отсутствие значения.

Учитывая это, вы можете определить вышеупомянутую переменную name с помощью перечисления:

Или вы можете использовать switch-case, как и в случае с обычным перечислением:

Посмотрев документацию, вы увидите, что optional поставляется с довольно удобными методами. Отличный пример — метод map:

Или метод flatMap, который в данном случае возвращает имя только в том случае, если оно прошло проверку на наличие не менее 5 символов:

Если вы хотите узнать больше о различиях между map, flatMap и compactMap, прочитайте мою статью в блоге — “CompactMap vs flatMap: объяснение различий”.

Расширение optional

Теперь вы знаете, что опция определяется как перечисление и вы также можете писать расширения для него!

Самый распространенный пример — расширение optional String для обработки пустого значения:

Хотя мы использовали перечисление для определения расширения, мы также могли бы использовать следующий синтаксис с вопросительным знаком:

3. Написание юнит-тестов для optional

Когда вы пишете юнит-тесты, есть хороший способ работать с optional без принудительного разворачивания. Если вы будете использовать принудительное разворачивание, вы рискуете вызвать фатальную ошибку, которая не позволит всем вашим тестам пройти успешно.

Вы можете использовать XCTUnwrap, который выбросит ошибку, если значение равно nil:

4. Необязательные (optional) методы протокола

Если у вас есть опыт работы с Objective-C, вы можете не обратить внимание на optional методы протокола. В Swift есть лучший способ имитировать такое поведение с помощью реализации протоколов по умолчанию, в стандартных библиотеках этот способ выглядит следующим образом:

Это позволяет вызывать метод с помощью вопросительного знака:

Подробнее о методах протоколов вы можете прочитать здесь — “Необязательные методы протокола в Swift”.

5. Вложенные optional — это вещь

Хотя SE-0230 — Flatten nested optionals resulting from ‘try?’ устранил одну из самых распространенных причин появления вложенного optional, это все еще вещь!

Вы развернули optional, который по-прежнему возвращает optional. В ранних версиях Swift это происходило при использовании оператора try?.

Частый пример — работа со словарями, содержащими необязательные значения:

Как видите, в основном требуется только использовать дополнительный восклицательный или вопросительный знак.

Заключение

Вот и все! Мы рассмотрели множество вещей, которые необходимо знать при работе с optional в Swift. От основ разворачивания с помощью восклицательных знаков (!!) до более продвинутых реализаций расширения перечисления Optional.

Спасибо!

Источник

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: