Приветствую! Эта лекция посвящена optional-значениям в Swift. Я расскажу о том, что это такое, как устроено внутри и для чего все это нужно. Optional — это контейнер для значений. Он может вернуть вам значение, содержащееся в нем, или сообщить, что значение отсутствует, и вернуть в этом случае nil. Например, при инициализации int-значения из строки у вас будет возвращен optional int, содержащий целочисленное значение в случае успеха, либо nil в случае неудачной инициализации. Пример на слайде. Для объявления переменных используются две формы записи: краткая и полная. Вариант с вопросительным знаком является предпочтительным, так как проще для записи и для восприятия. Что из себя представляет Optional? Это обычный enum, принимающий дженерик тип и содержащий два кейса: some и none. Соответственно и работать с ним можно, как с обычным enum. При объявлении переменной, если для нее не устанавливается значение, то оно автоматически определяется как nil. Для работы с Optional необходимо провести проверку на равенство nil, только после того как вы удостоверились, что переменная или константа содержат значение, вы можете работать с ней. Восклицательный знак используется для получения значения из Optional. Подобный прием называется Force unwrap. Попытка обращения к nil-значению при помощи Force unwrap приведет к аварийному завершению программы. Если при объявлении переменной или константы вы уверены в том, что значение точно будет установлено до первого обращения к ней, такую переменную можно пометить восклицательным знаком. Компилятор в этом случае позволит обращаться к переменной без дополнительных проверок и без Force unwrap. Однако такая переменная или константа все равно является optional-значением. В случае, если при работе с ней будет возвращено значение nil, вы также получите ошибку выполнения. Swift предлагает ряд инструментов для удобной и безопасной работы с optional-значениями. Optional Binding позволяет использовать if и while выражения для проверки значений в Optional. Перепишем ранее представленный пример: данное выражение не будет выполнено, если в counter содержится значение nil. Значение присвоенной переменной будет доступно только внутри выражения. При проверке можно присваивать значение нескольким переменным, а также выполнять другие проверки, возвращающие bool. Если хотя бы в одном случае вернется false, код внутри выражения выполняться не будет. Для того чтобы с переменной можно было работать не только внутри выражения, можно использовать конструкцию guard let. Как упоминалось в предыдущих лекциях, из выражения guard необходимо выполнить ранний выход. Для этого, например, можно использовать return, continue, break или throw в зависимости от ситуации. Еще одним способом, облегчающим работу с Optional, является использование nil-coalescing оператора, который обозначается с помощью двух вопросительных знаков. Это сокращенная форма для конструкции с использованием тернарного оператора. На слайде представлены два идентичных по значению выражения, но вторая запись проще для восприятия. В левой части оператора всегда должно находиться optional-значение, а в правой части значение того типа, которое содержится в optional-переменной. Теперь перейдем к optional chaining. Это процесс вызова метода, свойства или сабскрипта для optional-значения. Если значение Optional равняется nil, то и вызов функции, получение свойства и сабскрипта также вернет nil. Работа похожа на использование Force unwrap, только вместо восклицательного знака используется вопросительный. Результатом подобной операции всегда будет являться optional-значение. На слайдах показаны примеры использования Optional Chaining. Несмотря на то что свойства у объекта не являются optional-типами, результат все равно будет являться optional-значением, так как попытка обращения к свойству проходит по цепочке, в которой присутствует optional-значение. Chaining не ограничивается получением значения на одном уровне, вы можете продолжать получать по цепочке значение для свойств или вызывать методы. Этот прием работы можно использовать не только для получения, но и для установки значений. В этом случае часть кода справа от знака равенства не будет выполнена, если в левой части содержится nil. На примере показана попытка вызова функции, которая никогда не выполняется, так как у объекта в левой части отсутствует значение. Методы также можно вызывать с помощью Optional Chaining. Любая функция в Swift возвращает либо значение либо void, даже если это не указано явно. В данном случае это будет Optional Void, Как и в предыдущих примерах мы можем воспользоваться условным оператором if для проверки выполнения функции. При работе с сабскриптами необходимо обратить внимание на то, что вопросительный знак устанавливается до указания сабскрипта, а не после. Как и при работе со свойствами, можно не только получать, но и устанавливать значение для сабскрипта. Оба примера показаны на слайде. В случае получения optional- значения от сабскрипта, вопросительный знак ставим справа. Простым примером служит работа со словарями. При обращении к optional-значениям по сложной цепочке у вас не происходит дополнительного оборачивания Optional в Optional. То есть если вы должны были получить Optional String и для этого необходимо несколько раз использовать Chaining, то в конечном итоге вы все равно получите Optional String. На этом завершается краткий обзор Optional. В последующих уроках мы будем неоднократно использовать эти знания. А также демонстрировать другие приемы, облегчающие процесс написания программы с корректным и легко читаемым кодом.