什么“??”代表上下文:让x = y ?? “糖果条”

时间:2016-02-11 05:25:25

标签: swift operators

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

5 个答案:

答案 0 :(得分:4)

用于检查nil,如果您的值为nil,则会指定默认值。

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

来自您的代码,

  

假设人=&#34;夏娃&#34;

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

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

因此它会将值Pretzels分配给snackName变量。

  

假设人=&#34;艾伦&#34;

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

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

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

答案 1 :(得分:2)

请允许我根据其在其他语言中的含义来假设:

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

??检查favoriteSnacks [person]的值是否为null。如果不是那么,favoriteSnacks [person]的值将被分配给snackName。如果favoriteSnacks [person]的值为null,那么“Candy bar”将被分配给snackName。

如果favoriteSnacks [person]为空,则用于具有默认值。

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

例如如果您在词典中仅获得5个键和值,但有时获得nil键或值,则对于nil值将出现错误。 所以,这里的解决方案,

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

这意味着,如果jsonObjectName为nil,则自动将“未知”设置为strName。

注意:“?值”提供的默认值

答案 4 :(得分:0)

简单地解释

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

类似于写作

scans:
   Scanner1:
      detected: false
      version: "1.1.1.1"
      result: null
      update: "14123412"
   Scanner2:
      detected: true
      version: "2.2.2.2"
      result: "trojan"
      update: "23142551"

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