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