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()
}
}
在这个示例中:
-
class LandmarkStore: ObservableObject:定义了一个可观察的类LandmarkStore,它遵循ObservableObject协议。 -
@Published var landmarks: [String]:使用@Published属性包装器将landmarks属性标记为可观察的。当landmarks的值发生变化时,依赖它的视图会自动更新。 -
@ObservedObject var store = LandmarkStore():在ContentView中,使用@ObservedObject属性包装器来观察LandmarkStore实例。当store.landmarks发生变化时,视图会自动更新。
通过这种方式,你可以在 SwiftUI 中实现响应式编程,使视图能够自动响应数据的变化。

浙公网安备 33010602011771号