Основы Swift / 4.7. Оператор nil-пересечения


Видео


Оператор nil-пересечения
Оператор nil-пересечения (a ?? b) распаковывает опционал a, если он содержит значение, или возвращает значение по-умолчанию b, если a равен nil. Выражение a всегда опционального типа. Выражение b должно совпадать с типом, хранимым в a.

Оператор nil-пересечения - краткая форма для данного кода:
@{4.8\1}
                    
let a: Int? = 1
let b = 2
a != nil ? a! : b
                    
                
Здесь используется тернарный условный оператор и принудительное извлечение (a!) для доступа к значению внутри a, если a не равен nil, и возвращает значение b в противном случае. Оператор nil-пересечения предоставляет более элегантный способ для инкапсуляции этой условной проверки и распаковки в кратком и читаемом виде.

Если значение a не-nil, то значение b не будет вычислено. Это называется вычислением по кратчайшей траектории.
@{4.8\2}
                    
let defaultColorName = "пурпурный"
var userDefinedColorName: String?   // по-умолчанию задан в nil

var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName равен nil, так что colorNameToUse установлен в дефолтное значение "пурпурный"
                    
                
Пример использует оператор nil-пересечения для выбора между именем цвета по-умолчанию и опциональным именем цвета, заданным пользователем.

Переменная userDefinedColorName определена как опциональный String со значением по-умолчанию nil. Так как userDefinedColorName имеет опциональный тип, Вы можете использовать оператор nil-пересечения для рассмотрения его значения. Этот оператор использован для определения начального значения для переменной colorNameToUse типа String. Так как userDefinedColorName равен nil, то выражение userDefinedColorName ?? defaultColorName вернёт значение defaultColorName или "red".
Продолжение примера
Если Вы присвоите не-nil значение переменной userDefinedColorName и выполните проверку с помощью оператора nil-пересечения ещё раз, то значение, заложенное внутри userDefinedColorName, будет использовано вместо значения по-умолчанию:
@{4.8\3}
                    
let defaultColorName = "пурпурный"
var userDefinedColorName: String?

userDefinedColorName = "малиновый"
var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName не равен nil, так что colorNameToUse будет установлен в "малиновый"
                    
                
userDefinedColorName не равен nil, так что colorNameToUse будет установлен в "малиновый"