4

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

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

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

4

2 回答 2

4

你不应该省略Resultis 的情况failure。你不应该这样做,Result也不应该因为失败而关闭。您应该处理错误

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

于 2019-04-08T12:29:56.773 回答
-1

Swift 5 引入了Result<Success, Failure> associated value枚举[About]这意味着您的结果可以是success或者failure带有附加信息(成功结果或错误对象)。好的做法是将错误案例和成功案例作为原子任务进行管理。

优点:

  • 结果是可用于所有是/否情况的单一/通用(通用)/完整类型
  • 非可选类型
  • 强制消费者检查所有案例
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
    }
}
于 2021-02-28T19:20:18.897 回答