我有一个函数,它对于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以显示错误警报。
在我的情况下,有没有最好的方法来处理多种类型的错误?
答案 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
返回一个命令对象,然后在调用代码中解释它。