在 try 中使用零合并运算符?for 抛出并返回可选值的函数

Rau*_*nak 4 error-handling swift option-type

我想在以下两种情况下使用 nil-coalescing 运算符设置默认值:

  1. 函数抛出错误
  2. 函数返回 nil

请看一下下面的代码片段。我有以下问题:

  1. 为什么 item1 为零?
  2. item1 和 item2 的初始化有什么区别
enum VendingMachineError: Error {
    case invalidCode
}

class VendingMachine {
    func itemCode(code: Int) throws -> String? {
        guard code > 0 else {
            throw VendingMachineError.invalidCode
        }
        if code == 1 {
            return nil
        } else {
            return "Item #" + String(code)
        }
    }
}

let machine = VendingMachine()

// Question: Why is this nil?
let item1 = try? machine.itemCode(code: 0) ?? "Unknown"
print(item1)
// nil

// What is the difference between the initialization of item1 vs item2
let item2 = (try? machine.itemCode(code: 0)) ?? "Unknown"
print(item2)
// Unknown

Run Code Online (Sandbox Code Playgroud)

Swe*_*per 8

本质上,这与运算符的语法有关try。当与不带括号的二进制表达式一起使用时,try适用于整个二进制表达式,因此:

try? machine.itemCode(code: 0) ?? "Unknown"
Run Code Online (Sandbox Code Playgroud)

是相同的:

try? (machine.itemCode(code: 0) ?? "Unknown")
Run Code Online (Sandbox Code Playgroud)

由于itemCode抛出错误,因此表达式的后半部分?? "Unknown将被忽略,并且try?表达式的计算结果为 nil。

另一方面,第二个表达式是这样的:

(try? machine.itemCode(code: 0)) ?? "Unknown"
Run Code Online (Sandbox Code Playgroud)

首先计算表达式try?(为零),然后??应用 ,将整个表达式计算为“未知”。