?? 运算符在Swift中

在“Swift编程语言”一书(第599页)中,我遇到了这样的代码片段,使我感到困惑。 它是这样的:

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

其解释是:

buyFavoriteSnack(_ :)function查找给定的人最喜欢的零食,并试图为他们购买。 如果他们没有一个喜欢的小吃上市,它试图买一个糖果。 如果他们…

这个解释怎么能映射到“??” 运营商在给出的代码。 我们应该/我们可以在我们自己的代码中使用这个语法吗?

它是“零合并运营商”(也称为“默认运营商”)。 a ?? b a ?? ba (即a! )的值,除非anil ,在这种情况下,它产生b 。 也就是说,如果缺lessfavouriteSnacks[person] ,则返回指定"Candy Bar"代替。

编辑技术上可以解释为:(从下面的巴达尔·拉希德的答案)

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

这个:

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

等于这个:

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

用语言解释,如果let语句不能从favoriteSnacks抓取person ,它将把Candy Bar分配给snackName

 let something = a ?? b 

手段

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

除了@ Icaro的回答之外,您可以声明值而不用初始化它们。 在我看来这是更好的:

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