Swift中具有单个泛型函数的多错误类型的通用错误处理

时间:2018-01-18 06:16:08

标签: ios swift error-handling

我有一个函数,它对于RebloodError的泛型类型具有handleError。我有2种类型的错误枚举(InitialError和MainError)符合RebloodError协议(符合错误协议)。这是详细信息。

InitialError

enum InitialError: RebloodError {
    // Some Error Cases inside
}

MainError

enum MainError: RebloodError {
    // Some Error Cases inside
}

RebloodError

protocol RebloodError: Error { }

错误处理程序

@discardableResult func handleError<T: RebloodError>(_ error: T) -> Bool {
    let title = "Something Might Be Wrong"

    switch error {
    case .anErrorCase:
        presentErrorAlert(title: title, message: "Please Sign In to continue ", completionHandler: {
            // TODO: Go to sign in from here
        })
        return true


    default:
        presentErrorAlert(title: title, message: "Please contact support or try to relaunch the app", completionHandler: {
            exit(0)
        })
        return false
    }
}

presentErrorAlert是我的自定义函数,用于显示UIAlertController以显示错误警报。

在我的情况下,有没有最好的方法来处理多种类型的错误?

1 个答案:

答案 0 :(得分:1)

我建议为RebloodError添加一个用于错误处理需求的通用接口,并在具体的错误类型中实现:

protocol RebloodError: Error {
  var alertTitle: String { get }
  var alertMessage: String { get }
  func handle()
}

enum MainError: RebloodError {
  case foo
  case bar

  var alertTitle: String {
    switch self {
    case .foo: return "Foo!"
    case .bar: return "Bar!"
    }
  }      

  var alertMessage: String { ... }

  func handle() {
     switch self {
      case .foo: exit(0)
      default: ()
     }
  }
}

在您的处理代码中,您可以使用此界面获取所需的所有信息,错误将知道该怎么做:

func handleError<T: RebloodError>(_ error: T) -> Bool {
  presentErrorAlert(title: error.alertTitle, message: error.alertMessage, completionHandler: { error.handle() })
}

RebloodError.handle函数当然仅限于执行它可以在没有任何上下文信息的情况下执行的操作(例如弹出视图控制器)。如果你需要这个东西变得更复杂:例如你可以将一些上下文对象传递给方法(请记住,在调用时你不知道它是哪种具体类型,所以你需要一个公共的上下文接口);或者让RebloodError.handle返回一个命令对象,然后在调用代码中解释它。