简体   繁体   中英

?? 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?

It is "nil coalescing operator" (also called "default operator"). a ?? b a ?? b is value of a (ie a! ), unless a is nil , in which case it yields b . Ie 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
let something = a ?? b

手段

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

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

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM