在" Swift编程语言"书(第599页),我遇到了这段令我困惑的代码片段。它是这样的:
func buyFavoriteSnack(person:String) throws {
let snackName = favoriteSnacks[person] ?? "Candy Bar"
try vend(itemName:snackName)
}
其解释是:
buyFavoriteSnack(_ :)函数查找给定人最喜欢的零食并尝试为他们购买。如果他们没有列出最喜欢的零食,它会尝试买一个糖果棒。如果他们......
这个解释如何映射到" ??"给定代码中的运算符。什么时候应该/我们可以在自己的代码中使用这种语法吗?
答案 0 :(得分:71)
它是“nil coalescing operator”(也称为“默认运算符”)。 a ?? b
的值为a
(即a!
),除非a
为nil
,在这种情况下,它会产生b
。即如果缺少favouriteSnacks[person]
,请返回指定"Candy Bar"
。
修改强> 从技术上讲,可以解释为:(来自Badar Al-Rasheed的答案)
let something = a != nil ? a! : b
答案 1 :(得分:19)
let something = a ?? b
装置
let something = a != nil ? a! : b
答案 2 :(得分:15)
此:
let snackName = favoriteSnacks[person] ?? "Candy Bar"
等于这个:
if favoriteSnacks[person] != nil {
let snackName = favoriteSnacks[person]
} else {
let snackName = "Candy Bar"
}
用文字解释,如果let
语句无法从person
抓取favoriteSnacks
,则会将糖果栏指定给snackName
答案 3 :(得分:3)
nil-coalescing operator a ?? b
是a != nil ? a! : b
答案 4 :(得分:1)
除了@ 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)
}