Подтвердить что ты не робот

?? оператора в Свифте

В книге "Быстрый язык программирования" (стр. 599) я наткнулся на этот фрагмент кода, который меня смутил. Это было так:

func buyFavoriteSnack(person:String) throws {
    let snackName = favoriteSnacks[person] ?? "Candy Bar"
    try vend(itemName:snackName)
}

Его объяснение было:

Функция buyFavoriteSnack (_:) просматривает данную любимую закуску и пытается ее купить. Если у них нет любимой закуски, она пытается купить конфету. Если они...

Как это объяснение можно сопоставить с "??" оператора в указанном коде. Когда мы/должны использовать этот синтаксис в нашем собственном коде?

4b9b3361

Ответ 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)
}