【问题标题】:Swift 5 Result typeSwift 5 结果类型
【发布时间】:2019-08-29 14:22:44
【问题描述】:

在 Swift 5 中,Apple 引入了 Result 类型。这是有两种情况的通用枚举:

public enum Result<Success, Failure: Error> {
    case success(Success), failure(Failure)
}

我个人曾经在网络调用 success: Completionfailure: Completion 中使用两个单独的完成,但从我现在看到的情况来看,Apple 推动我们使用带有 Result 类型的单一完成,然后在内部执行切换。那么Result 这种方法的优势是什么?因为在很多情况下,我可以省略错误处理而不写这个switch。谢谢。

【问题讨论】:

  • Imo 到处切换会很痛苦。我仍然会坚持使用两个完成处理程序。这样一来,控制流程就更清晰了。
  • 不强制使用Result。你可以做你想做的。但我相信很多很多人(比如我自己)都会欣赏并利用它。
  • 与 Objective-C 不兼容可能是个问题。重写你所有的代码,那是没用的。优点:当你在做相同的代码而不是在其他地方分解它时,比如“重新显示一些东西,启用用户交互等”。在失败和成功的情况下。

标签: swift swift5


【解决方案1】:

Resultfailure 时,您不应省略大小写。你不应该用Result 来做这件事,你也不应该用你的失败来做这件事。您应该处理错误

无论如何,Result 类型是为了简化完成处理程序而引入的。您可以使用单个闭包来处理成功或失败(如果两个单独的闭包更好与否,则基于主要意见)。 Result 也是为错误处理而设计的。您可以简单地创建符合Error 的自己的enum,然后您可以创建自己的错误案例。

【讨论】:

    【解决方案2】:

    Swift 5 引入了Result&lt;Success, Failure&gt; associated value enumeration[About] 这意味着您的结果可以是successfailure 附加信息(成功结果或错误对象)。好的做法是将错误案例和成功案例作为原子任务进行管理。

    优点:

    • 结果是单一/通用(通用)/完整类型,可用于所有是/否情况
    • 非可选类型
    • 强制消费者检查所有案例
    public enum Result<Success, Failure>  {
        case success(Success)
        case failure(Failure)
    }
    

    使用它

    //create
    func foo() -> Result<String, Error> {
        //logic
        if ok {
            return .success("Hello World")
        } else {
            return .failure(.someError)
        }
    }
    
    //read
    func bar() {
        let result = foo()
        switch result {
        case .success(let someString):
            //success logic
        case .failure(let error):
            //fail logic
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      • 2016-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多