Основы Swift / 4.5. Неявно извлекаемые опционалы


Видео


Неявно извлекаемые опционалы
Как описано выше, опционалы отражают константы или переменные, которым разрешено иметь "пустое значение".

Иногда ясно из структуры программы, что опционал всегда будет иметь значение после его инициализации. В таких случаях будет полезным убрать необходимость проверки и распаковки опционального значения всякий раз при доступе к нему: можно предположить без всякого риска, что он будет иметь значение всё время.

Эти виды опционалов определены как неявно извлекаемые опционалы. Вы можете создать неявно извлекаемые опционалы, разместив восклицательный знак (String!) вместо знака вопроса (String?) после типа, который вы хотите сделать опциональным.

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

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

Неявно извлечённый опционал - на самом деле это обычный опционал, но он также может быть использован как неопциональное значение без необходимости извлекать его значение всякий раз при доступе к нему. Следующий пример показывает разницу в поведении между опциональной строкой и неявно извлекаемой строкой при доступе к их обёрнутым значением в качестве явной строки:
@{4.5\1}
                    
let possibleString: String? = "Опциональная строка."
let forcedString: String = possibleString!

let assumedString: String! = "Неявно извлекаемая опциональная строка."
let implicitString: String = assumedString
                    
                
Смысл неявно извлекаемых опционалов
Вы можете думать о неявно извлекаемых опционалах как о даче разрешения опционалу быть распакуемым автоматически всякий раз при его использовании. Вместо написания восклицательного знака после имени опционала при каждом использовании, Вы ставите восклицательный знак сразу после типа опционала, когда Вы его объявляете.

Если неявно извлекаемый опционал равен nil и Вы пытаетесь получить доступ к его запакованному значению, Вы получите ошибку времени выполнения. Результат будет тот же, если бы Вы попробовали поставить восклицательный знак после обычного опционала, который не содержит значения:
@{4.5\2}
                    
let assumedString: String! = nil
let implicitString: String = assumedString // ошибка выполнения
                    
                
Неявно извлекаемые опционалы в качестве обычных
Вы можете работать с неявно извлекаемым опционалом как и с обычным опционалом для проверки на наличие значения.

В данном примере неявно извлекаемая опциональная строка не равна nil, а потому будет выведена в теле if:
@{4.5\3}
                    
let assumedString: String! = "Неявно извлекаемая опциональная строка."
if assumedString != nil {
    print(assumedString)
}
                    
                
Опциональное связывание для неявно извлекаемых опционалов
Вы также можете использовать неявно извлекаемые опционалы с опциональным связыванием для проверки и извлечения значения за одну инструкцию:
@{4.5\4}
                    
let assumedString: String! = "Неявно извлекаемая опциональная строка."
if let definiteString = assumedString {
    print(definiteString)
}