- Published on
SwiftUI-da @Observable macro
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
iOS 17 da Apple Swift tiliga macro qo'llab-quvvatlashni qo'shdi. Shu bilan birga, view model va boshqa kuzatiluvchi obyektlar uchun yangi, soddaroq usul β @Observable macro paydo bo'ldi. Bu eski ObservableObject protokoliga muqobil.
@Observablefaqat iOS 17 va undan yuqori versiyalarni qo'llab-quvvatlovchi loyihalarda ishlatiladi. Agar ilovangiz eski iOS versiyalarini ham qo'llab-quvvatlasa,ObservableObjectishlatishda davom etish kerak β bu eskirgan (deprecated) emas va uzoq vaqt ishlayveradi.
Eski usul β ObservableObject
class ObservableViewModel: ObservableObject {
@Published var title: String = "Boshlang'ich sarlavha"
}
Ota viewda:
struct ParentView: View {
@StateObject private var viewModel = ObservableViewModel()
var body: some View {
Button(viewModel.title) {
viewModel.title = "Yangi sarlavha"
}
}
}
Bola viewga uzatishda:
struct ChildView: View {
@ObservedObject var viewModel: ObservableViewModel
var body: some View {
Button(viewModel.title) {
viewModel.title = "Bola viewdan o'zgartirildi"
}
}
}
Environment orqali uzatishda:
struct ThirdView: View {
@EnvironmentObject var viewModel: ObservableViewModel
var body: some View {
Button(viewModel.title) {
viewModel.title = "Uchinchi viewdan o'zgartirildi"
}
}
}
// Ota viewda environment-ga qo'shish:
ThirdView()
.environmentObject(viewModel)
Yangi usul β @Observable
@Observable macro ObservableObject protokoliga muqobil. Bu macro klassga avtomatik ravishda kerakli kodni qo'shadi.
@Observable
class ObservableViewModel {
var title: String = "Boshlang'ich sarlavha"
}
O'zgarishlar ro'yxati
| Eski usul | Yangi usul |
|---|---|
class X: ObservableObject | @Observable class X |
@Published var title | var title (hech qanday belgisiz) |
@StateObject private var viewModel | @State private var viewModel |
@ObservedObject var viewModel | @Bindable var viewModel |
@EnvironmentObject var viewModel | @Environment(ViewModel.self) var viewModel |
.environmentObject(viewModel) | .environment(viewModel) |
Eng muhim farq β @Published kerak emas
ObservableObject-da view-ni yangilash kerak bo'lgan har bir xususiyatga @Published qo'shish kerak edi. @Observable-da esa barcha xususiyatlar standart holatda kuzatiladi β alohida belgi qo'yish shart emas.
Agar biror xususiyat view-ni yangilamasligi kerak bo'lsa, uni @ObservationIgnored bilan belgilash kerak:
@Observable
class ObservableViewModel {
var title: String = "Kuzatiladi" // standart β kuzatiladi
@ObservationIgnored
var internalCounter: Int = 0 // kuzatilmaydi
}
Bu eski usulga teskari mantiq: avval hamma narsa kuzatilmaydi edi, kerak bo'lganini @Published bilan qo'shish kerak edi. Endi hamma narsa kuzatiladi, kerak bo'lmaganini @ObservationIgnored bilan chiqarib tashlash kerak.
Yangi usulda to'liq misol
@Observable
class ObservableViewModel {
var title: String = "Boshlang'ich sarlavha"
}
struct ParentView: View {
@State private var viewModel = ObservableViewModel()
var body: some View {
VStack(spacing: 40) {
Button(viewModel.title) {
viewModel.title = "Yangi sarlavha"
}
ChildView(viewModel: viewModel)
ThirdView()
}
.environment(viewModel)
}
}
struct ChildView: View {
@Bindable var viewModel: ObservableViewModel
var body: some View {
Button(viewModel.title) {
viewModel.title = "Bola viewdan o'zgartirildi"
}
}
}
struct ThirdView: View {
@Environment(ObservableViewModel.self) var viewModel
var body: some View {
Button(viewModel.title) {
viewModel.title = "Uchinchi viewdan o'zgartirildi"
}
}
}
Uchala view ham bitta viewModel obyektini kuzatadi va istalgan biridan o'zgartirish boshqalarga ham aks etadi.
Migratsiya tartibi
Apple-ning rasmiy hujjatlarida ko'rsatilgan qadamlar:
: ObservableObjectni olib tashlang, o'rniga@Observableqo'shing- Barcha
@Published vardan@Publishedni olib tashlang @StateObjecto'rniga@Stateishlating@ObservedObjecto'rniga@Bindableishlating@EnvironmentObjecto'rniga@Environment(Type.self)ishlating.environmentObject(obj)o'rniga.environment(obj)ishlating
Migratsiyani bosqichma-bosqich amalga oshirish tavsiya etiladi. Mavjud loyihani to'liq qayta yozish shart emas β yangi fayllar yozilganda yangi usulni qo'llash, eski kodni esa kerak bo'lganda o'zgartirish yetarli.
Thread xavfsizligi haqida eslatma
@Observable-ga o'tish view yangilanishlarini boshqarish usulini o'zgartiradi, lekin bu thread mantiqini o'zgartirmaydi. UI yangilanishlari hamon main thread-da bajarilishi shart β @Observable bu masalani hal qilmaydi.
Xulosa
Bu videoda o'rgandik:
@ObservableβObservableObjectprotokoliga muqobil, iOS 17+ uchun yangi macro@Publishedkerak emas β barcha xususiyatlar standart holatda kuzatiladi- Kuzatilmasligi kerak bo'lgan xususiyatlar uchun
@ObservationIgnored @StateObjectβ@State,@ObservedObjectβ@Bindable,@EnvironmentObjectβ@Environment(Type.self)- Eski va yangi usul parallel ishlatilishi mumkin β
ObservableObjecteskirmagan - Migratsiya bosqichma-bosqich, yangi kod yozilganda amalga oshirilishi tavsiya etiladi
Keyingi videoda yangi mavzu bilan davom etamiz.