swift - 从结果成功值回退到错误的 Swift 表达式
问题描述
如何在成功的情况下从 Result 的成功值或在失败的情况下从错误值派生出一个值,而无需创建临时变量?
这是我正在尝试做的一个有效但冗长的示例:
let result = Result<Int, Error>.success(1)
let displayText: String
switch result {
case let .success(value): displayText = String(value)
case let .failure(error): displayText = "Result not available. \(error)"
}
updateDisplayText(displayText)
通过将结果转换为所需格式的可选值,使用 try 运算符对其进行测试,并使用 nil-coalescing 运算符提供回退,我可以得到接近的结果。
updateDisplayText((try? result.map{ v in String(v) }.get()) ?? "Result not available.")
但是,该方法不会访问失败的错误。它也似乎过于复杂。是否有一种适用于单个表达式的方法,类似于使用 F#匹配表达式可以完成的方法?
解决方案
Swift 中没有“匹配表达式”。据我所知,如果您想与具有关联值的枚举进行匹配,则必须使用某种语句,无论是 an if case
orswitch
还是其他。
但是,没有人可以阻止您将该语句放入方法中,然后您可以将其放入扩展中!
extension Result {
func mapBoth<T>(success: (Success) -> T, error: (Failure) -> T) -> T {
switch self {
case .success(let s):
return success(s)
case .failure(let e):
return error(e)
}
}
}
updateDisplayText
然后可以这样调用:
updateDisplayText(result.mapBoth(
success: { String($0) },
failure: { "Result not available. \($0)" }
))
推荐阅读
- android - 无法在 asyncTask 中的 onPostExecute 中发送消息
- html - 无法使这个 flexbox 布局响应足够快
- java - 合并 JSON 树杰克逊
- python-3.x - webdriver.Firefox:WebDriverException:消息:“geckodriver”可执行文件需要在 PATH 中
- c# - 如何在 Azure ServiceBusTriggerAttribute 中指定具有主题/订阅的特定终结点?
- html - 如何使用 html-testRunner 报告在新行中显示已运行测试的打印文本?
- javascript - 应用程序无法识别在 Angular 9 中使用 Hammer.JS 和 HammerGestureConfig 的滑动
- css - CSS Flexbox - 背景颜色和文本不对齐
- spring-boot - 使用 intelij 随机重新加载 Spring Boot 容器
- reactjs - React Navigation - Stack.Navigator screenProps 不起作用