?? operator in Swift

23,344

Solution 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.

EDIT Technically can be interpreted as: (From Badar Al-Rasheed's Answer below)

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

Solution 2

let something = a ?? b

means

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

Solution 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

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

Solution 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)
}
Share:
23,344
avismara
Author by

avismara

iOS developer. Chess enthusiast. Bookworm.

Updated on April 04, 2020

Comments

  • avismara
    avismara about 4 years

    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?