ErrorHierarchy
是一个小框架,旨在利用 SwiftUI 视图层级结构作为错误处理的响应链。
更详细的解释可以在 这篇文章 中找到。
TL;DR: 使用包含在 EnvironmentValues
中的闭包,层级结构中较低的 View
对象将 Error
对象发送到视图层级结构中更高的位置,而层级结构中更高的视图使用其中一个修饰符将自己注册为响应器,以接收、转换或处理 Error
对象。
这是 EventHierarchy
的兄弟框架,但专门用于错误处理。
使用添加到 EnvironmentValues
的 reportError
闭包触发错误。
示例
struct MyError: Error {}
struct TriggerView: View {
@Environment(\.reportError) var reportError
var body: some View {
Button("Trigger") {
reportError(MyError())
}
}
}
可以对已触发的 Error
应用三种操作。 所有这些操作都是通过注册一个闭包来执行的,其方式与将视图修饰符应用于 View
相同。
struct ContentView: View {
var body: some View {
TriggerView()
.receiveError { .notHandled }
.transformError { MyError() }
.handleError {}
}
}
所有这些函数都有一个泛型版本,它接收 Error
的类型作为第一个参数,只有与提供的类型匹配的错误才会被处理,任何其他错误都将继续在视图层级结构中传播。
struct ContentView: View {
var body: some View {
TriggerView()
.handleError(MyError.self) {}
}
}
接收 Error
时,由注册的闭包来确定 Error
是否已完全处理。
如果注册的闭包返回 .handled
,则 Error
将不再在视图层级结构中传播。 如果它返回 .unhandled
,则 Error
将继续传播。
任何被处理的错误将不再在视图层级结构中传播。 这等效于使用始终返回 .handled
的 receiveError
闭包。
转换函数可用于替换接收到的 Error
。 它可以是不同类型的 Error
,也可以是相同类型但具有不同值的 Error
。
AlertableError
是面向用户的错误可以遵循的协议。 唯一非可选的要求是 message
String
,它将显示给用户。
通过使用 .handleAlertErrors()
修饰符,任何可警告的错误都将通过向用户显示带有单个关闭按钮的警报来处理。
注意: 如果错误是由包含在 sheet 中的 View
触发的,则需要在 sheet 的正文中调用此修饰符,否则将无法显示警报。 这也适用于 popover 和其他类似的修饰符。