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.