SwiftUI

2023 年 9 月 20 日

在 SwiftUI 透過 environment 傳遞 Observable

已複製到剪貼板


遵從 Observable protocol 的物件可以使用 environment 來傳遞。

SwiftUI logo

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 來取得資料。

分享文章

已複製到剪貼板

主題文章

查看 SwiftUI

超級感謝

關於 XcodeProject

XcodeProject 創立於 2023,致力於協助開發者探索 Apple 的創新世界,學習在 iOS、iPadOS、macOS、tvOS、visionOS 與 watchOS 上開發 App,發現眾多技術與框架,讓開發者獲得更多能力。


Contacts

Ricky Chuang

XcodeProject

RickyChuang.xcodeproj@gmail.com

XcodeProject 聯絡

contact.xcodeproj@gmail.com

最新文章