Найти в Дзене
Coding Corner

Работа с Optional значениями в Swift

Решил написать этот небольшой гайд, потому что вспомнил как в начале своего пути меня раздражал этот Optional тип, как я долго его игнорировал, чего мне не хватало для конечного понимания и дальнейшего пользования. Для начала, давайте обратимся к официальной документации чтобы кратко вывести тезис. По своей сути это перечисление (enum) или если проще - безопасная обертка над результатом. У нее есть два значения - some() и none(). Обертка возникает автоматически когда мы производим действие, итогом которого может быть nil или none(). Some() символизирует наличие результата, с которым мы можем продолжить работу. None() символизирует отсутствие результата или просто "Nil". Простой пример с дальнейшим пояснением : let text_sample : String = "64" let parser : Int = Int(text_sample) // в результате это значение будет Optional Один из самых банальных примеров. Что здесь происходит? Сначала мы создаем строчку, которая состоит из двух символов - 64 - в строчном формате. Следующей строчкой ко
Оглавление

Решил написать этот небольшой гайд, потому что вспомнил как в начале своего пути меня раздражал этот Optional тип, как я долго его игнорировал, чего мне не хватало для конечного понимания и дальнейшего пользования.

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

https://developer.apple.com/documentation/swift/optional
https://developer.apple.com/documentation/swift/optional

По своей сути это перечисление (enum) или если проще - безопасная обертка над результатом. У нее есть два значения - some() и none(). Обертка возникает автоматически когда мы производим действие, итогом которого может быть nil или none().

Some() символизирует наличие результата, с которым мы можем продолжить работу.

None() символизирует отсутствие результата или просто "Nil".

Простой пример с дальнейшим пояснением :

let text_sample : String = "64"

let parser : Int = Int(text_sample) // в результате это значение будет Optional

Один из самых банальных примеров. Что здесь происходит? Сначала мы создаем строчку, которая состоит из двух символов - 64 - в строчном формате. Следующей строчкой кода мы преобразуем строку text_sample в числовое значение Int. И переменная parser куда записывается результат будет иметь значение some(64).

Если мы представим , что передавалось не 64, а, например, "hello" - программа не смогла бы преобразовать результат в число Int и вернула бы none().

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

В противном случае, если вы попытаетесь раскрыть Optional с none() - программа сразу завершится с сообщением об том, что вы попытались задействовать нулевое значение или "nil".

Как раскрывать Optional значения

Возьмем одну строчку кода, где мы создаем ссылку из переданной строки.

let test : URL = URL(string : "https://dzen.ru/")

Переменная test примет значение Optional потому что нет гарантий, что конвертация пройдет успешно. Как его развернуть?

1) Через использование "!"

let test : URL = URL(string : "https://dzen.ru/")!

Самый грубый способ. Таким образом мы говорим, что уверены в своих действиях и можем гарантировать, что преобразование всегда будет успешное и optional будет с типом some() перед тем, как его раскроют. В противном случае программа просто завершится из за нахождения nil.

2) Через использование "??"

let test : URL = URL(string : "https://dzen.ru/") ?? "https://apple.com/"

Дает возможность проработать ошибку путем подстановки другого значения после ??, которое гарантировано будет находиться в some() и при раскрытии не будет давать nil.

3) Через оператора "if let"

if let test = URL(string : "https://dzen.ru/") {

} // Внутрь круглых скобок помещается продолжение кода.

Прорабатывает и раскрывает Optional значение путем условного оператора. Если переданное значение будет соответствовать some() и не будет давать nil при раскрытии - выполнение кода продолжится. Иначе ничего не произойдет. Или вы можете дописать дальнейшие действия в else :)

4) Через оператора "guard"

guard let test = URL(string : "https://dzen.ru/") else { return }

Работает так же как и предыдущий способ. Guard подобна слову "убедиться", сначала код убеждается, что переменная получает не nil после преобразования. Если все хорошо - выполняет код ниже. Иначе выполняет блок else в круглых скобках.

Личная рекомендация

Старайтесь по минимуму использовать первый способ. Во время тестирования это подходит. В других ситуациях - категорически нет. Используя ! вместо проработки всех возможных вариантов вы можете серьезно испортить UX из-за постоянных крашей программы в случае непредвиденных сценариев.

Благодарю за внимание!

-2