@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 中實現響應式程式設計,使檢視能夠自動響應資料的變化。