?? Swift中的运算符

时间:2015-06-11 05:11:15

标签: ios swift

在" Swift编程语言"书(第599页),我遇到了这段令我困惑的代码片段。它是这样的:

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

其解释是:

  

buyFavoriteSnack(_ :)函数查找给定人最喜欢的零食并尝试为他们购买。如果他们没有列出最喜欢的零食,它会尝试买一个糖果棒。如果他们......

这个解释如何映射到" ??"给定代码中的运算符。什么时候应该/我们可以在自己的代码中使用这种语法吗?

5 个答案:

答案 0 :(得分:71)

它是“nil coalescing operator”(也称为“默认运算符”)。 a ?? b的值为a(即a!),除非anil,在这种情况下,它会产生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 ?? ba != 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)
}