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