遵從 Observable protocol 的物件可以使用 environment
來傳遞。
Observable 和 ObservableObject 概覽
Observable 是 Apple 在 WWDC23 推出,用來取代 ObservableObject 的 protocol,它在使用上方便不少。在之前使用 ObservableObject 的情況下,如果我們想靠 Environment 來傳遞,必須使用 environmentObject:
final class Profile: ObservableObject { ... }
@main
struct Example: App {
var body: some Scene {
WindowGroup {
ContentView()
}
.environmentObject(ProfileService.currentProfile)
}
}
假設 ProfileService 是一個 Singleton,而它有一個變數 currentProfile 的型別就是遵從 ObservableObject 的 Profile。
而如果我們要在 ContentView 裡取用的話,會使用 @EnvironmentObject:
struct ContentView: View {
@EnvironmentObject private var profile: Profile
var body: some View { ... }
}
改用 environment 來傳遞 Observable
要從 ObservableObject 轉用 Observable 的話,非常簡單!以下分成三個步驟:
步驟一:把 ObservableObject 換成 Observable
把遵從 ObservableObject 拿掉,並在前面加上 @Observable,如果裡面有使用到 @Published 的話,也可以全部拿掉。
@Observable
final class Profile { ... }
步驟二:把 environmentObject 換成 environment
把 ObservableObject 改用 Observable 最大的差別就是可以使用 environment:
@main
struct Example: App {
var body: some Scene {
WindowGroup {
ContentView()
}
.environment(ProfileService.currentProfile)
}
}
步驟三:把 EnvironmentObject 換成 Environment
在取用資料時,把 EnvironmentObject 改成 Environment property wrapper:
struct ContentView: View {
@Environment(Profile.self) private var profile: Profile
var body: some View { ... }
}
這樣就完成了。只要是在 ContentView 裡或在任何它的子 View,都能透過 @Environment 來取得資料。
關於 XcodeProject
XcodeProject 創立於 2023,致力於協助開發者探索 Apple 的創新世界,學習在 iOS、iPadOS、macOS、tvOS、visionOS 與 watchOS 上開發 App,發現眾多技術與框架,讓開發者獲得更多能力。