首页 > 解决方案 > 从结果成功值回退到错误的 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

解决方案


Swift 中没有“匹配表达式”。据我所知,如果您想与具有关联值的枚举进行匹配,则必须使用某种语句,无论是 an if caseorswitch还是其他。

但是,没有人可以阻止您将该语句放入方法中,然后您可以将其放入扩展中!

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)" }
))

推荐阅读