'?? operator in Swift

In the "The Swift Programming Language" book (page 599), I came across this code snippet that kind of confused me. It went like this:

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

Its explanation was:

The buyFavoriteSnack(_:) function looks up the given person's favorite snack and tries to buy it for them. If they don't have a favorite snack listed, it tries to buy a candy bar. If they...

How can this explanation map to the "??" operator in the code given. When should/can we use this syntax in our own code?



Solution 1:[1]

It is "nil coalescing operator" (also called "default operator"). a ?? b is value of a (i.e. a!), unless a is nil, in which case it yields b. I.e. if favouriteSnacks[person] is missing, return assign "Candy Bar" in its stead.

Solution 2:[2]

let something = a ?? b

means

let something = a != nil ? a! : b

Solution 3:[3]

This:

let snackName = favoriteSnacks[person] ?? "Candy Bar"

Is equals this:

if favoriteSnacks[person] != nil {
    let snackName = favoriteSnacks[person]    
} else {
    let snackName = "Candy Bar"
}

Explaining in words, if the let statement fail to grab person from favoriteSnacks it will assigned Candy Bar to the snackName

Solution 4:[4]

The nil-coalescing operator a ?? b is a shortcut for a != nil ? a! : b

Solution 5:[5]

One addition to @Icaro's answer you can declare values without initialize them. In my opinion this is better:

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)
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Vega
Solution 2 Bader Al-Rasheed
Solution 3 Ray Toal
Solution 4 Floern
Solution 5 mustafa