@EnvironmentObject — SwiftUI-dagi property wrapper bo'lib, ierarxiyadagi istalgan View-ga ObservableObject-ga inizializatorlar zanjiri orqali aniq uzatmasdan kirish imkonini beradi. Ob'ekt .environmentObject() modifikatori yordamida ierarxiyaning ma'lum darajasida muhitga in'eksiya qilinadi, shundan so'ng barcha bolaviy View-lar uni @EnvironmentObject orqali olishi mumkin. Bu obyektdan foydalanmaydigan oraliq View-lar orqali obyektni uzatish zaruratini bartaraf etadi — prop drilling deb ataladi. John Sundell — Swift by Sundell (2025) maqolasiga ko'ra, @EnvironmentObject ayniqsa ekranlararo ma'lumotlar uchun foydalidir: foydalanuvchi sessiyasi, ilova sozlamalari, xarid savati menejeri yoki mahalliy ma'lumotlar keshi.
Asosiy fikrlar
@EnvironmentObject — SwiftUI View-ga ilova muhitidan (environment) ObservableObject-ga kirish imkonini beruvchi property wrapper. Muhit — .environmentObject() modifikatori yordamida View ierarxiyasining istalgan darajasida obyektlarni joylashtirishingiz mumkin bo'lgan konteyner. Obyekt muhitga joylashtirilgandan so'ng, istalgan bolaviy View uni @EnvironmentObject bilan xususiyat e'lon qilish va obyekt turini ko'rsatish orqali olishi mumkin.
@EnvironmentObject-ning asosiy vazifasi — obyektni har bir oraliq darajadan uzatish zaruratisiz chuqur View ierarxiyasi orqali ma'lumot uzatish muammosini hal qilishdir. NavigationStack, TabView va modal oynalarning tarmoqlangan tuzilishiga ega murakkab ilovalarda @EnvironmentObject boilerplate kodni bartaraf etib, arxitekturani sezilarli darajada soddalashtiradi.
Apple Developer Documentation — Environment (2025)-ga ko'ra, @EnvironmentObject PreferenceKey va View identifikatsiyasiga asoslangan SwiftUI ichki mexanizmidan foydalanadi. Har bir View o'z muhitiga havolani saqlaydi, u ota-ona View-dan meros qilib olinadi va .environmentObject() yordamida kengaytirilishi mumkin. Obyektni qidirish ierarxiya bo'ylab yuqoriga, ildiz View-gacha amalga oshiriladi.
class UserSession: ObservableObject {
@Published var isLoggedIn = false
@Published var userName: String = ""
func login(name: String) {
userName = name
isLoggedIn = true
}
}
@main
struct MyApp: App {
@StateObject var session = UserSession()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(session)
}
}
}
@EnvironmentObject SwiftUI-ga o'rnatilgan bog'liqliklarni in'eksiya qilish (DI) mexanizmi asosida ishlaydi. View-da .environmentObject() chaqirganingizda, SwiftUI obyektni ushbu View va uning barcha avlodlari bilan bog'liq maxsus omborda saqlaydi. Bolaviy View bir xil turdagi @EnvironmentObject e'lon qilganda, SwiftUI ota-onalar ierarxiyasi bo'ylab yuqoriga ko'tarilib, obyektni muhitda qidiradi.
Muhim xususiyat — obyektning turi muhitda qidirish uchun kalit sifatida ishlatiladi. Agar muhitda bir xil turdagi ikkita obyekt bo'lsa, SwiftUI ierarxiyada joriy View-ga eng yaqinini topadi. Obyektni WindowGroup darajasida in'eksiya qilish uni ilonaning barcha ekranlari uchun global ravishda mavjud qiladi, bu umumiy maqsadli xizmatlar uchun qulay.
objc.io — SwiftUI Architecture (2025)-ga ko'ra, ichki jihatdan @EnvironmentObject @ObservedObject-ga o'xshash mexanizmdan foydalanadi, ammo ierarxiyada obyektni qidirish uchun qo'shimcha abstraksiya darajasi bilan. SwiftUI obyektni nusxalamaydi va yaratmaydi — mavjud instansiyaga havolani uzatadi, shuning uchun obyektdagi o'zgarishlar @EnvironmentObject dan foydalanadigan barcha View-lar uchun avtomatik ravishda ko'rinadi.
Ham @EnvironmentObject, ham @ObservedObject bir xil asosiy funksiyani bajaradi — View-larni ObservableObject o'zgarishlariga obuna qiladi. Farq obyektni uzatish mexanizmidadir. @ObservedObject inizializator orqali aniq uzatishni talab qiladi, @EnvironmentObject esa har bir oraliq View-da aniq ko'rsatmasdan obyektni muhitdan oladi.
| Xususiyat | @EnvironmentObject | @ObservedObject |
|---|---|---|
| Uzatish | Ierarxiya darajasida .environmentObject() orqali | Har bir View inizializatori orqali |
| Bog'liqliklarning ochiqligi | Yashirin — View imzosida ko'rinmaydi | Ochiq — View init-da ko'rinadi |
| Oraliq View-lar | Obyekt haqida bilmaydi | Obyektni oldinga uzatishi kerak |
| Xato xavfi | Obyekt bo'lmaganda runtime crash | Kompilyatsiya vaqtida tekshirish (agar parametr majburiy bo'lsa) |
| Prop drilling | Bartaraf etadi | Qo'lda uzatishni talab qiladi |
@EnvironmentObject va @ObservedObject o'rtasidagi tanlov arxitekturaga bog'liq. Agar obyekt ierarxiyada chuqur va ko'plab ekranlar uchun kerak bo'lsa — @EnvironmentObject qulayroq. Agar arxitektura testlash va o'qish qulayligi uchun bog'liqliklarning ochiq ko'rsatilishini talab qilsa — @ObservedObject afzalroq.
Eng keng tarqalgan stsenariy — ilonaning barcha ekranlarida mavjud bo'lishi kerak bo'lgan foydalanuvchi sessiyasi. UserSession-ni .environmentObject() orqali ilova ildizida in'eksiya qilib, istalgan ekran foydalanuvchi ma'lumotlariga va avtorizatsiya holatiga kirish imkoniyatiga ega bo'ladi.
struct ProfileView: View {
@EnvironmentObject var session: UserSession
var body: some View {
VStack {
if session.isLoggedIn {
Text("Salom, \(session.userName)")
Button("Chiqish") {
session.isLoggedIn = false
}
} else {
LoginView()
}
}
}
}
struct SettingsView: View {
@EnvironmentObject var session: UserSession
var body: some View {
Form {
Text("Sifatida kirdingiz: \(session.userName)")
}
}
}
E'tibor bering: na ProfileView, na SettingsView session-ni inizializator orqali olmaydi. Ular shunchaki @EnvironmentObject var session: UserSession e'lon qiladi va SwiftUI avtomatik ravishda obyektni muhitda topadi. Bu mavjud ma'lumot uzatish kodini o'zgartirmasdan yangi ekranlar qo'shish imkonini beradi.
@EnvironmentObject-ning asosiy xavfi — obyekt muhitga in'eksiya qilinmagan bo'lsa runtime crash. Ixtiyoriy parametrlardan farqli o'laroq, @EnvironmentObject nil bo'la olmaydi. @EnvironmentObject bilan View ekranda paydo bo'lsa va ota-ona View bu tur uchun .environmentObject() chaqirmagan bo'lsa, ilova darhol "Fatal error: No ObservableObject of type X found" xatosi bilan ishdan chiqadi.
Agar ierarxiyaning turli darajalarida bir xil turdagi ikkita obyektni in'eksiya qilsangiz, bolaviy View ierarxiyada eng yaqinini oladi. Bu chalkashlikka olib kelishi mumkin, agar dasturchi ildiz muhitidagi obyekt o'z muhitiga ega modal oynada mavjud bo'lishini kutsa.
SwiftUI rivojlanishi bilan @EnvironmentObject-ning ba'zi kamchiliklarini hal qiluvchi muqobil bog'liqlikni boshqarish usullari paydo bo'ldi — birinchi navbatda bog'liqliklarning yashirinligi va runtime crash xavfi.
Yondashuvni tanlash jamoa kattaligi va ilova murakkabligiga bog'liq. Kichik loyihalar uchun @EnvironmentObject ajoyib ishlaydi. O'nlab ekranlari va testlashga qattiq talablari bo'lgan katta loyihalar uchun @ObservedObject orqali aniq uzatish yoki DI konteyneri afzalroq.
Tez-tez beriladigan savollar
Ha, View har xil turdagi istalgan miqdorda @EnvironmentObject e'lon qilishi mumkin. SwiftUI har bir turni muhitda mustaqil ravishda qidiradi. Bu View bir vaqtning o'zida foydalanuvchi sessiyasi, sozlamalar va xarid savatiga kirishga muhtoj bo'lganda qulay — har bir obyekt alohida in'eksiya qilinadi.
Preview View-ni ko'rsatishga urinayotganda runtime error bilan ishdan chiqadi. @EnvironmentObject ishlatadigan View-lar uchun Preview-da har doim .environmentObject() qo'shing. Preview to'g'ri ishlashi va realistik holatni ko'rsatishi uchun test ma'lumotlari bilan mock obyektlardan foydalaning.
Yo'q, @EnvironmentObject faqat ObservableObject-ni amalga oshiradigan aniq sinif turi bilan ishlaydi. Protokollar uchun type erasure yoki o'ramdan foydalanishingiz kerak: protokol turidagi obyektga havolani saqlaydigan o'ram sinfini yarating va o'ramni @EnvironmentObject orqali in'eksiya qiling.
Test ma'lumotlari bilan ObservableObject namunasini yarating va uni View-ga .environmentObject(testObject) orqali testda uzating. Bu SwiftUI UI testi uchun standart namunadir. Birlik testlari uchun mantiqni ObservableObject-da izolyatsiya qiling va uni View-dan alohida test qiling.
@EnvironmentObject qo'shimcha ishlash yukini yaratmaydi, chunki u obyektni faqat havola sifatida uzatadi, nusxalamaydi. Biroq, global obyektdagi @Published xususiyatlarining tez-tez yangilanishi bir vaqtning o'zida ko'plab View-larning qayta chizilishiga olib kelishi mumkin, bu esa ishlashga ta'sir qilishi mumkin.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.