?? operador en Swift

En el libro “The Swift Programming Language” (página 599), me encontré con este fragmento de código que me confundió. Fue así:

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

Su explicación fue:

La función buyFavoriteSnack (_ 🙂 busca el bocadillo favorito de la persona dada e intenta comprarlo para ellos. Si no tienen un bocadillo favorito en la lista, trata de comprar una barra de chocolate. Si ellos…

¿Cómo puede esta explicación asignarse al “??” operador en el código dado. ¿Cuándo debería / podemos usar esta syntax en nuestro propio código?

Es “operador sin coalescencia” (también llamado “operador predeterminado”). a ?? b a ?? b es el valor de a (es decir, a! ), a menos que a sea nil , en cuyo caso rinde b . Es decir, si falta favouriteSnacks[person] , vuelva a asignar "Candy Bar" en su lugar.

EDITAR Técnicamente se puede interpretar como: (A partir de la respuesta de Badar Al-Rasheed)

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

medio

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

Esta:

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

Es igual a esto:

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

Explicando en palabras, si el enunciado let no logra captar a la person de snackName asignará Candy Bar al snackName

El operador de nil-coalescing a ?? b a ?? b es un atajo para a != nil ? a! : b a != nil ? a! : b

Una adición a la respuesta de @Icaro puede declarar valores sin inicializarlos. En mi opinión, esto es mejor:

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