将零合并运算符与Try一起使用?对于抛出并返回可选的函数

Using nil-coalescing operator with try? for function that throws and returns optional(将零合并运算符与Try一起使用?对于抛出并返回可选的函数)
本文介绍了将零合并运算符与Try一起使用?对于抛出并返回可选的函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  1. 函数引发错误
  2. 函数返回nil

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

  1. 为什么项目1为空?
  2. 项目1的初始化与项目2的初始化有什么不同
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

推荐答案

本质上,这与try运算符的语法有关。当与不带括号的二进制表达式一起使用时,try applies to the whole binary expression,因此:

try? machine.itemCode(code: 0) ?? "Unknown"

与:

相同
try? (machine.itemCode(code: 0) ?? "Unknown")

由于itemCode引发错误,?? "Unknown表达式的后半部分被忽略,try?表达式的计算结果为空。

另一方面,第二个表达式如下所示:

(try? machine.itemCode(code: 0)) ?? "Unknown"

首先对try?表达式求值(为零),然后应用??,将整个表达式求值为"未知"。

这篇关于将零合并运算符与Try一起使用?对于抛出并返回可选的函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Why local notification is not firing for UNCalendarNotificationTrigger(为什么没有为UNCalendarNotificationTrigger触发本地通知)
Pushing UIViewController above UITabBar(将UIView控制器推送到UITabBar上方)
Dropbox Files.download does not start when number of files in folder is gt; 1000(当文件夹中的文件数为1000时,Dropbox Files.Download不会启动)
appearance().setBackgroundImage Not Working On Custom Class(外观().setBackoundImage在自定义类上不起作用)
Show/Hide barButtonItem(显示/隐藏barButtonItem)
java.lang.IllegalStateException: SimpleTypeImpl should not be created for error type(异常:不应为错误类型创建SimpleTypeImpl)