swiftUI- @Observable的使用

Aliancn發表於2024-08-25

@Observable 是 Swift 語言中的一個屬性包裝器(property wrapper),用於將類的屬性標記為可觀察的。這意味著當這些屬性的值發生變化時,依賴這些屬性的檢視或其他物件會自動更新。@Observable 通常用於 SwiftUI 和 Combine 框架中,以實現響應式程式設計。

然而,值得注意的是,@Observable 並不是 Swift 標準庫的一部分,而是 SwiftUI 和 Combine 框架中的概念。在 SwiftUI 中,類似的功能通常透過 @StateObject@ObservedObject@EnvironmentObject 來實現。

以下是一個使用 @ObservedObject 的示例,展示瞭如何在 SwiftUI 中實現可觀察的物件:

import SwiftUI
import Combine

// 定義一個可觀察的類
class LandmarkStore: ObservableObject {
    @Published var landmarks: [String] = ["Statue of Liberty", "Eiffel Tower", "Great Wall of China", "Taj Mahal"]
}

struct ContentView: View {
    @State private var searchText = ""
    @ObservedObject var store = LandmarkStore()
    
    var filteredLandmarks: [String] {
        if searchText.isEmpty {
            return store.landmarks
        } else {
            return store.landmarks.filter { $0.contains(searchText) }
        }
    }

    var body: some View {
        VStack {
            TextField("Search", text: $searchText)
                .padding()
                .textFieldStyle(RoundedBorderTextFieldStyle())
            
            List {
                ForEach(filteredLandmarks, id: \.self) { landmark in
                    Text(landmark)
                }
            }
            .animation(.default, value: filteredLandmarks)
        }
        .padding()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

在這個示例中:

  1. class LandmarkStore: ObservableObject:定義了一個可觀察的類 LandmarkStore,它遵循 ObservableObject 協議。

  2. @Published var landmarks: [String]:使用 @Published 屬性包裝器將 landmarks 屬性標記為可觀察的。當 landmarks的值發生變化時,依賴它的檢視會自動更新。

  3. @ObservedObject var store = LandmarkStore():在 ContentView 中,使用 @ObservedObject 屬性包裝器來觀察 LandmarkStore 例項。當 store.landmarks 發生變化時,檢視會自動更新。

透過這種方式,你可以在 SwiftUI 中實現響應式程式設計,使檢視能夠自動響應資料的變化。

相關文章