弃用通知

ErrorHierarchy 和 EventHierarchy 已合并到 HierarchyResponder 中。HierarchyResponder 不仅支持事件和错误,还允许两者之间的互操作性,使您可以捕获错误并将其转换为事件,并为事件响应器添加抛出支持。

错误层级 (Error Hierarchy)

tests codecov Platforms Swift 5.5 License Twitter

ErrorHierarchy 是一个小框架,旨在利用 SwiftUI 视图层级结构作为错误处理的响应链。

更详细的解释可以在 这篇文章 中找到。

TL;DR: 使用包含在 EnvironmentValues 中的闭包,层级结构中较低的 View 对象将 Error 对象发送到视图层级结构中更高的位置,而层级结构中更高的视图使用其中一个修饰符将自己注册为响应器,以接收、转换或处理 Error 对象。

这是 EventHierarchy 的兄弟框架,但专门用于错误处理。

触发 Error

使用添加到 EnvironmentValuesreportError 闭包触发错误。

示例

struct MyError: Error {}

struct TriggerView: View {
	@Environment(\.reportError) var reportError
	
	var body: some View {
		Button("Trigger") {
			reportError(MyError())
		}
	}
}

接收、处理和转换 Error

可以对已触发的 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 时,由注册的闭包来确定 Error 是否已完全处理。

如果注册的闭包返回 .handled,则 Error 将不再在视图层级结构中传播。 如果它返回 .unhandled,则 Error 将继续传播。

处理 Error

任何被处理的错误将不再在视图层级结构中传播。 这等效于使用始终返回 .handledreceiveError 闭包。

转换 Error

转换函数可用于替换接收到的 Error。 它可以是不同类型的 Error,也可以是相同类型但具有不同值的 Error

可警告错误 (Alertable Errors)

AlertableError 是面向用户的错误可以遵循的协议。 唯一非可选的要求是 message String,它将显示给用户。

通过使用 .handleAlertErrors() 修饰符,任何可警告的错误都将通过向用户显示带有单个关闭按钮的警报来处理。

注意: 如果错误是由包含在 sheet 中的 View 触发的,则需要在 sheet 的正文中调用此修饰符,否则将无法显示警报。 这也适用于 popover 和其他类似的修饰符。