gpt4 book ai didi

ios - Swift 中具有单个泛型函数的多种错误类型的泛型错误处理

转载 作者:行者123 更新时间:2023-11-28 12:11:38 25 4
gpt4 key购买 nike

我有一个函数可以处理一般类型的 RebloodError 的错误。我有两种符合 RebloodError 协议(protocol)(符合 Error 协议(protocol))的错误枚举(InitialError 和 MainError)。这是详细信息。

初始错误

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

主要错误

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

重血错误

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 以显示错误警报。

在我的案例中,是否有使用泛型函数处理多种类型错误的最佳方法?

最佳答案

我建议为 RebloodError 添加一个通用接口(interface)来满足您的错误处理需求,并在您的具体错误类型中实现它:

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: ()
}
}
}

在您的处理代码中,您可以使用此接口(interface)获取您需要的所有信息,错误将知道该怎么做:

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

RebloodError.handle 函数当然仅限于在没有任何上下文信息的情况下执行它可以执行的操作(例如弹出 View Controller )。如果你需要这个,事情会变得更复杂:例如您可以将一些上下文对象传递给该方法(请记住,在调用时您不知道它是哪个具体类型,因此您还需要一个通用的上下文接口(interface));或者让 RebloodError.handle 返回一个命令对象,然后您可以在调用代码中对其进行解释。

关于ios - Swift 中具有单个泛型函数的多种错误类型的泛型错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48314946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com