用于不官方支持观察的平台的观察工具。
此库由 Brandon Williams 和 Stephen Celis 创建,他们主持了 Point-Free 视频系列,该系列探索了高级 Swift 语言概念。
Perception 库提供了模仿 Swift 5.9 中的 @Observable
和 withObservationTracking
的工具,但它们被向后移植以支持一直到 iOS 13、macOS 10.15、tvOS 13 和 watchOS 6 的版本。这意味着您可以立即开始利用 Swift 5.9 的观察工具,即使您不能放弃对旧版 Apple 平台的支持。使用此库的工具几乎与使用官方工具完全相同,但有一个小小的例外。
首先,使用 @Perceptible
宏而不是 @Observable
宏将类标记为可观察的
@Perceptible
class FeatureModel {
var count = 0
}
然后,您可以使用常规 let
属性在视图中保留一个可感知的模型
struct FeatureView: View {
let model: FeatureModel
// ...
}
并且在视图的 body
中,您必须使用 WithPerceptionTracking
视图包装您的内容,以便正确设置观察
struct FeatureView: View {
let model: FeatureModel
var body: some View {
WithPerceptionTracking {
Form {
Text(model.count.description)
Button("Increment") { model.count += 1 }
}
}
}
}
必须将视图的内容包装在 WithPerceptionTracking
中有点遗憾,但是如果您忘记了,您将收到一个运行时警告,告知您观察未正确设置
🟣 运行时警告:可感知状态被访问,但未被跟踪。通过将您的视图包装在“WithPerceptionTracking”视图中来跟踪状态更改。对于任何逃逸的、尾随的闭包,例如“GeometryReader”、
LazyVStack
(以及所有惰性视图)、导航 API(“sheet”、“popover”、“fullScreenCover”等)和其他,也必须这样做。
SwiftUI 的 @Bindable
属性包装器也被向后移植以支持可感知对象。您只需使用 Perception
模块限定属性包装器即可
struct FeatureView: View {
@Perception.Bindable var model: FeatureModel
// ...
}
SwiftUI 的 @Environment
属性包装器和 environment
视图修饰符对观察的支持也已被向后移植,以使用完全相同的 API 支持可感知对象
struct FeatureView: View {
@Environment(Settings.self) var settings
// ...
}
// In some parent view:
.environment(settings)
如果您想讨论此库或对如何使用它来解决特定问题有疑问,可以与 Point-Free 爱好者在多个地方进行讨论
Perception API 的最新文档可在此处获取:here。
此库在 MIT 许可证下发布。有关详细信息,请参阅 LICENSE。