“??”是什么意思?在上下文中代表:let x = y ?? "Candy bar"

What does "??" stand for in the context of: let x = y ?? "Candy bar"

我是 Swift 的新手。有人可以告诉我什么“??”在

的上下文中代表什么以及它的功能是什么
let snackName = favoriteSnacks[person] ?? "Candy bar"

我已经包含了下面的完整代码:

struct Item{
    var price: Int
    var count: Int
}

class VendingMachine {
    var inventory = [
    "Candy bar": Item(price: 12, count: 7),
    "Chips": Item(price: 10, count: 4),
    "Pretzels": Item(price: 7, count: 11)
    ]
    var coinsDeposited = 0
    func dispenseSnack(snack: String){
        print("dispensing \(snack)")
    }

    func vend(itemNamed name: String) throws {
        guard var item = inventory[name] else {
            throw VendingMachineError.InvalidSelection
        }

        guard item.count > 0 else {
            throw VendingMachineError.OutOfStock
        }

        guard item.price <= coinsDeposited else {
            throw VendingMachineError.InsufficientFunds(coinsNeeded: item.price - coinsDeposited)
        }

        coinsDeposited -= item.price
        --item.count
        inventory[name] = item
        dispenseSnack(name)
    }
}

let favoriteSnacks = [
    "Alice": "Chips",
    "Bob": "Licorice",
    "Eve": "Pretzels",
]

func buyFavoriteSnack(person: String, vendingMachine: VendingMachine) throws {
    let snackName = favoriteSnacks[person] ?? "Candy bar"
    try vendingMachine.vend(itemNamed: snackName)
}

让我根据它在其他语言中的含义来假设这里:

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

??检查 favoriteSnacks[person] 的值是否为空。如果不是,则 favoriteSnacks[person] 的值将分配给 snackName。如果 favoriteSnacks[person] 的值为 null,则 "Candy bar" 将分配给 snackName。

它用于在 favoriteSnacks[person] 为空的情况下具有默认值。

它的 Nil Coalescing Operator 基本上给出了值不存在时的默认值。

另见 Providing a default value for an Optional in Swift?

用于校验nil,如果你的值为nil,则赋默认值。

let favoriteSnacks = [
    "Alice": "Chips",
    "Bob": "Licorice",
    "Eve": "Pretzels",
]

根据您的代码,

suppose person = "Eve"

let snackName = favoriteSnacks["Eve"] ?? "Candy bar"

它将首先尝试从字典中查找值,即 favoriteSnacks["Eve"] 将为您提供值 "Pretzels"

所以它会将值 Pretzels 赋值给 snackName 变量。

suppose person = "Allen"

let snackName = favoriteSnacks["Allen"] ?? "Candy bar"

它将首先尝试从字典中查找值,即 favoriteSnacks["Allen"] 将为您提供值 nil

在这种情况下,它会将默认值 "Candy bar" 分配给您的变量 snackName

例如。如果你在字典中只得到 5 个键和值,但有时得到 nil 键或值,那么 nil 值就会出错。 所以,这里的解决方案,

 var strName = jsonObjectName ?? "Unknown"
 var intAge = jsonObjectAge ?? 25

这意味着,如果 jsonObjectName 为 nil,则 "Unknown" 将自动设置为 strName。

注:默认值由“??值”提供

简单说明,

let value = x ?? y

类似于写作,

let value = x != nil ? x! : y

它检查 x 是否包含 nil,如果不包含则强制展开它,否则 returns 在上述情况下是 y。