Observation 框架完全指南:从入门到实战
1. 什么是 Observation?为什么需要它?
Observation 是 Apple 在 WWDC 2023 上推出的全新框架,彻底革新了 Swift 中的数据观察机制。它取代了基于 Combine 框架中 @Published 和 ObservableObject 的旧有模式,提供了更高性能、线程安全且更直观的解决方案。Observation 的核心是 Observable 协议和 @Observable 宏,它们能够精确追踪单个属性的变化,而非整个对象。
为什么需要它?在 iOS、macOS、watchOS 和 tvOS 的现代开发中,SwiftUI 是构建界面的主要框架。SwiftUI 需要一种机制来感知数据变化,从而只重新渲染真正发生变化的界面部分。旧有的 ObservableObject 方法会在任何属性变化时重新渲染整个视图,导致不必要的计算和性能下降。Observation 通过精确追踪单个属性的变化,完美解决了这一问题。
核心优势:Observation 是 Swift 标准库的一部分(从 iOS 17、macOS 14、tvOS 17、watchOS 10 开始),无需额外依赖,完全线程安全(可在任何线程修改数据,通知在主线程传递),并通过 @Bindable 宏和新的 .onChange(of:) 修饰符与 SwiftUI 深度集成。
2. 安装指南
Observation 是 Apple 的内置框架。它是 Swift 标准库的一部分,从 Swift 5.9 和 Xcode 15 开始提供。无需通过任何包管理器(CocoaPods、Swift Package Manager、Carthage)进行额外安装。
开始使用 Observation 只需三步:
- 安装 Xcode 15 或更高版本。
- 在项目设置中,确保最低部署目标(Deployment Target)设置为 iOS 17、macOS 14、tvOS 17 或 watchOS 10。
- 在需要使用框架的文件中导入:
import Observation。
如果你使用 SwiftUI,则无需单独导入 Observation——导入 SwiftUI 时它会自动可用。
3. 快速上手——最小工作示例
让我们创建一个简单的数据模型和显示它的视图。
import SwiftUI
// 1. 创建可观察类
@Observable
class UserSettings {
var username: String = "游客"
var isLoggedIn: Bool = false
}
// 2. 在视图中使用
struct ContentView: View {
// @State 管理生命周期
@State private var settings = UserSettings()
var body: some View {
VStack(spacing: 20) {
Text("用户:\(settings.username)")
.font(.title)
TextField("输入用户名", text: $settings.username)
.textFieldStyle(.roundedBorder)
.padding()
Toggle("登录", isOn: $settings.isLoggedIn)
.padding()
if settings.isLoggedIn {
Text("您已登录为 \(settings.username)")
.foregroundColor(.green)
} else {
Text("您尚未登录")
.foregroundColor(.red)
}
}
.padding()
}
}
在这个示例中,@Observable 宏自动将 UserSettings 类转换为