swiftUI- @Observable的使用

@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 中实现响应式编程,使视图能够自动响应数据的变化。

posted @ 2024-08-25 08:55  Aliancn  阅读(130)  评论(0编辑  收藏  举报