感知

CI Slack

用于不官方支持观察的平台的观察工具。

了解更多

此库由 Brandon WilliamsStephen Celis 创建,他们主持了 Point-Free 视频系列,该系列探索了高级 Swift 语言概念。

video poster image

概述

Perception 库提供了模仿 Swift 5.9 中的 @ObservablewithObservationTracking 的工具,但它们被向后移植以支持一直到 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”等)和其他,也必须这样做。

Bindable

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