?? оператора в Свифте
В книге "Быстрый язык программирования" (стр. 599) я наткнулся на этот фрагмент кода, который меня смутил. Это было так:
func buyFavoriteSnack(person:String) throws {
let snackName = favoriteSnacks[person] ?? "Candy Bar"
try vend(itemName:snackName)
}
Его объяснение было:
Функция buyFavoriteSnack (_:) просматривает данную любимую закуску и пытается ее купить. Если у них нет любимой закуски, она пытается купить конфету. Если они...
Как это объяснение можно сопоставить с "??" оператора в указанном коде. Когда мы/должны использовать этот синтаксис в нашем собственном коде?
Ответы
Ответ 1
Это "оператор объединения нуля" (также называемый "оператор по умолчанию" ). a ?? b
- это значение a
(т.е. a!
), если a
не равно nil
, и в этом случае оно дает b
. То есть если favouriteSnacks[person]
отсутствует, верните вместо него "Candy Bar"
.
ИЗМЕНИТЬ
Технически можно интерпретировать как: (От ответа Бадар аль-Рашид ниже)
let something = a != nil ? a! : b
Ответ 2
Это:
let snackName = favoriteSnacks[person] ?? "Candy Bar"
Is равно:
if favoriteSnacks[person] != nil {
let snackName = favoriteSnacks[person]
} else {
let snackName = "Candy Bar"
}
Объясняя слова, если оператор let
не может захватить person
из favoriteSnacks
, он назначит Candy Bar на snackName
Ответ 3
let something = a ?? b
означает
let something = a != nil ? a! : b
Ответ 4
Одно дополнение к ответу @Icaro позволяет объявлять значения без их инициализации. По-моему, это лучше:
func buyFavoriteSnack(person:String) throws {
// let snackName = favoriteSnacks[person] ?? "Candy Bar"
let snackName: String
if let favoriteSnackName = favoriteSnacks[person] {
snackName = favoriteSnackName
} else {
snackName = "Candy Bar"
}
try vend(itemName:snackName)
}