SwiftUI میں @Environment ایک property wrapper ہے جو سسٹم ماحول سے قدرتیں پڑھنے کے لیے، اور View کے درجہ بندی میں خودکار طور پر پھیلائے جاتے ہیں۔ یہ کمپونینٹ رنگ اسکیم، مقامی ترتیبات، فونٹ کا سائز، managedObjectContext اور درجنوں دیگر سسٹم پیرامیٹرز تک رسائی فراہم کرتا ہے۔ Apple Developer Documentation (2025) کے مطابق، @Environment اس بات کی ضمانت دیتا ہے کہ ماحول کی قدرت میں کوئی بھی تبدیلی سب سبسکرائیب شدہ View کو دوبارہ رینڈر کرنے کا سبب بنتی ہے، جو دستی کالز کے بغیر ریاکٹو انٹرفیس اپ ڈیٹ فراہم کرتا ہے۔
اہم نکات
@Environment ایک SwiftUI property wrapper ہے جو سسٹم ماحول سے قدرتیں پڑھنے کے لیے ڈزائن کیا گیا ہے۔ ماحول قدرتوں کا ایک درجہ بند کنٹینر ہے جسے SwiftUI والد View سے تفریعی View میں خودکار طور پر پھیلاتا ہے۔ هر ماحول قدرت ایک کنجی سے پہچانی جاتی ہے — ایک قسم جو EnvironmentKey پروٹوکول کی پیروی کرتا ہے۔
ماحول کا میکانزم فریم ورک کی سطح پر dependency injection کے مشابہ ہے: سسٹم قدرتوں کا ایک متعین کردہ سیٹ فراہم کرتا ہے — رنگ اسکیم (ہلکا/اندھیرا)، مقامی ترتیبات، فونٹ کا سائز، Core Data کے لیے managedObjectContext، سکرین بند کرنے کے لیے dismiss، اور بہت سے دیگر۔ ایک View جو ایک مختصص کنجی کے ساتھ @Environment کا اعلان کرتا ہے خودکار طور پر موجودہ قدرت حاصل کرتا ہے اور اس کے بدلنے پر دوبارہ رینڈر ہوتا ہے۔
SwiftUI ماحول کے فن کے گجرداری EnvironmentValues پروٹوکول پر مبنی ہے — ایک ساخت جیسمیں تمام سسٹم قدرتیں ہوتی ہیں۔ ہر قدرت getter اور setter کے ساتھ اس ساخت کی ایک خاصیت کے طور پر محفوظ ہوتی ہے۔ @Environment ایک مختصص خاصیت تک رسائی کے لیے key path استعمال کرتا ہے: @Environment(\.colorScheme) — رنگ اسکیم تک رسائی، @Environment(\.locale) — مقامی ترتیبات تک رسائی۔
Property wrapper @Environment دو بنیادی میکانزم نفذ کرتا ہے: ماحول سے قدرت پڑھنا اور اس کی تبدیلیوں کی سبسکرائیب۔ جب کئی View تیار ہوتی ہے، SwiftUI تمام @Environment خوصیات سے گزرتا ہے اور انہیں موجودہ سیاق سے متبادل قدرتوں سے منسلک کرتا ہے۔ اگر ایک والد View .environment() موڈیفائر کے ذریعے قدرت بدلتا ہے، تو وہ قدرت پڑھنے والے تمام تفریعی View خودکار طور پر دوبارہ رینڈر ہو جاتے ہیں۔
ایک اہم خصوصیت: @Environment اختیاری قدرتوں کی حمایت کرتا ہے۔ اگر درجہ بندی میں کوئی قدرت مقرر نہیں ہے، تو EnvironmentKey میں متعین کردہ پھلی سے طے کی قدرت واپس کی جاتی ہے۔ سسٹم کنجیوں کے لیے، پھلی سے طے کی قدرت ہمیشہ مناسب ہوتی ہے — مثال کے طور پر، پھلی سے طے کی رنگ اسکیم .light ہے۔ کسٹم کنجیوں کے لیے، ڈیویلپر EnvironmentKey پروٹوکول کے defaultValue طریقے میں پھلی سے طے کی قدرت متعین کرتا ہے۔
struct EnvironmentReaderView: View {
@Environment(\.colorScheme) var colorScheme
@Environment(\.locale) var locale
@Environment(\.sizeCategory) var sizeCategory
var body: some View {
VStack {
Text("Current scheme: \(colorScheme == .dark ? "Dark" : "Light")")
Text("Locale: \(locale.identifier)")
Text("Font size: \(sizeCategory)")
}
}
}
مثال میں، View تین سسٹم ماحول قدرتیں پڑھتا ہے۔ جب colorScheme بدلتا ہے — مثال کے طور پر، صاحب استعمال نے ترتیبات میں ڈارک موڈ فعال کیا — View خودکار طور پر نئی قدرت کے ساتھ دوبارہ رینڈر ہوتا ہے۔ ایسے ہی جب علاقہ یا فونٹ کا سائز (Dynamic Type) بدلتا ہے۔ View کو اطلاعات کی رکندگی لینے یا refresh کال کرنے کی ضرورت نہیں ہے — SwiftUI اسے خودکار طور پر منتظم کرتا ہے۔
SwiftUI انٹرفیس اور رویہ کے مختلف پہلوئوں کو گھیرے کرنے والی درجنوں سسٹم ماحول قدرتیں فراہم کرتا ہے۔ رنگ اسکیم (\.colorScheme) سب سے زیاده استعمال کی جانے والی قدرتوں میں سے ایک ہے، جو انٹرفیس کو ہلکے اور اندھیرے ثیم کے مطابق ڢٹنے کی اجازت دیتا ہے۔ مقامی ترتیبات (\.locale) میں تاریخوں، عددوں اور کرنسیوں کی فرمیٹنگ کے لیے صاحب استعمال کی علاقائی ترتیبات شامل ہیں۔
Core Data کے لیے، managedObjectContext (\.managedObjectContext) استعمال ہوتا ہے — ایک سیاق جو استقلال کنٹینر سے ماحول کے ذریعے گزارا جاتا ہے۔ نیویگیشن کے لیے، موجودہ سکرین بند کرنے کے لیے dismiss (\.dismiss) اور موڈل پرستاونیوں کے لیے isPresented (\.isPresented) دستیاب ہیں۔ کیلنڈر اور وقتی زون کے لیے — بالترتیب calendar اور timeZone۔
| Key Path | قسم | مقصد |
|---|---|---|
| \.colorScheme | ColorScheme | ہلکا یا اندھیرا ثیم |
| \.locale | Locale | علاقائی ترتیبات |
| \.sizeCategory | ContentSizeCategory | Dynamic Type فونٹ کا سائز |
| \.managedObjectContext | NSManagedObjectContext | Core Data سیاق |
| \.dismiss | DismissAction | سکرین بند کریں |
| \.calendar | Calendar | موجودہ کیلنڈر |
| \.timeZone | TimeZone | وقتی زون |
| \.horizontalSizeClass | UserInterfaceSizeClass | افقی سکرین کا سائز |
سسٹم قدرتوں تک رسائی کے لیے، نقطے کے ساتھ key path استعمال کریں: @Environment(\.dismiss) var dismiss۔ کامپائلر EnvironmentValues میں key path کی موجودگی کی جانچ کرتا ہے، اس لیے ایک غلط کنجی کامپائل ٹائم کی غلطی کا سبب بنے گی۔ Apple iOS کے ہر نئے ورزن کے ساتھ نئی سسٹم قدرتیں شامل کرتا ہے — مکمل فہرست EnvironmentValues دستاویز میں دستیاب ہے۔
ایک جیسے ناموں کے باوجود، @Environment اور @EnvironmentObject مختلف مقاصد کی تکمیل کرتے ہیں۔ @Environment EnvironmentKey کے ذریعے رجسٹر شدہ سسٹم یا کسٹم قدرتوں کو پڑھتا ہے۔ @EnvironmentObject ایک ObservableObject کے لیے property wrapper ہے جو بغیر واضح کنجی کے قسم کے اعتبار سے ماحول کے ذریعے گزارا جاتا ہے۔
@EnvironmentObject dependency injection کے لیے استعمال ہوتا ہے: ایک والد View ایک آبجیکٹ (مثال کے طور پر ViewModel) تیار کرتا ہے اور .environmentObject() موڈیفائر کے ذریعے تفریعی View میں بھیجتا ہے۔ تفریعی View اسے @EnvironmentObject کے ذریعے وصول کرتے ہیں اور اس کی خوصیات کو پڑھ اور ترمیم کر سکتے ہیں۔ دوسری جانب، @Environment سسٹم قدرتوں کے لیے صرف پڑھنے کے لیے ہے اور فیڈبیک کی حمایت نہیں کرتا۔
| پیرامیٹر | @Environment | @EnvironmentObject |
|---|---|---|
| مقصد | سسٹم اور کسٹم قدرتیں | ObservableObject انجیکشن |
| کنجی | EnvironmentValues key path | آبجیکٹ کی قسم کے مطابق |
| لیکھنا | صرف پڑھنا | پڑھنا اور لیکھنا |
| کسٹم قدرت | EnvironmentKey کے ذریعے | ObservableObject کلاس کے ذریعے |
| پھلی سے طے کی قدرت | ہاں (defaultValue) | نہیں (گزارنا لازمی ہے) |
عملی طور پر: سسٹم پیرامیٹرز (ثیم، مقامی ترتیبات، فونٹ کا سائز) اور ایسے کسٹم ترتیبات جو رن ٹائم میں نہیں بدلتے تک رسائی کے لیے @Environment استعمال کریں۔ View کے درجہ بندی کے ذریعے ViewModel یا سروس گزارنے کے لیے @EnvironmentObject استعمال کریں جب حالت کو تفریعی اجزاء سے ترمیم کرنے کی ضرورت ہو۔
ایک کسٹم ماحول قدرت بنانے پر غور کریں۔ ایسا کرنے کے لیے، آپ کو EnvironmentKey پروٹوکول کی پیروی کرنے والی ایک ساخت متعین کرنے اور EnvironmentValues کو ایک نئی خاصیت سے وسیع کرنے کی ضرورت ہے۔ یہ props کے بغیر پورے View درخت میں ثیم ترتیبات یا ایپ سیٹنگز گزارنے کی اجازت دیتا ہے۔
struct AppThemeKey: EnvironmentKey {
static let defaultValue: AppTheme = .system
}
extension EnvironmentValues {
var appTheme: AppTheme {
get { self[AppThemeKey.self] }
set { self[AppThemeKey.self] = newValue }
}
}
enum AppTheme { case system, light, dark }
EnvironmentKey پروٹوکول کو ستاٹک defaultValue خاصیت کے نفاذ کی ضرورت ہے — وہ قدرت جو استعمال ہوگی اگر والد View نے کسٹم ماحول مقرر نہیں کیا۔ EnvironmentValues کو وسیع کرنا کنجی کے ساتھ subscript استعمال کرکے ایک حساب شدہ خاصیت appTheme شامل کرتا ہے۔ اس کے بعد، کئی بھی View @Environment(\.appTheme) کے ذریعے قدرت پڑھ سکتا ہے۔
struct ThemedView: View {
@Environment(\.appTheme) var appTheme
@Environment(\.colorScheme) var colorScheme
var body: some View {
VStack {
if appTheme == .dark || (appTheme == .system && colorScheme == .dark) {
Text("Dark mode active")
.foregroundStyle(.white)
.background(Color.black)
} else {
Text("Light mode active")
.foregroundStyle(.black)
.background(Color.white)
}
}
}
}
struct ContentView: View {
@State private var selectedTheme = AppTheme.system
var body: some View {
ThemedView()
.environment(\.appTheme, selectedTheme)
}
}
ThemedView دو ماحول پڑھتا ہے: کسٹم appTheme اور سسٹم colorScheme۔ یہ مجموعہ لچیلا ثیم ترتیب کی اجازت دیتا ہے: صاحب استعمال ہلکا، اندھیرا یا سسٹم ثیم منتخب کر سکتا ہے۔ اگر سسٹم منتخب کیا جاتا ہے، قدرت colorScheme سے لی جاتی ہے، جو iOS ترتیبات میں ثیم بدلنے پر خودکار طور پر بدلتا ہے۔ والد View (ContentView) .environment() موڈیفائر کے ذریعے appTheme قدرت مقرر کرتا ہے۔
struct ModalView: View {
@Environment(\.dismiss) var dismiss
@State private var name = ""
var body: some View {
NavigationStack {
Form {
TextField("Your name", text: $name)
Button("Save") { dismiss() }
}
.navigationTitle("Edit Profile")
}
}
}
یہ مثال dismiss کے عملی استعمال کو ظاہر کرتا ہے — ماحول سے DismissAction کی ایک مثال۔ ایک فنکشن کے طور پر dismiss() کو کال کرنے سے موڈل سکرین بند ہو جاتی ہے یا NavigationLink واپس آ جاتا ہے۔ واحد شرط یہ ہے کہ View موڈل طور پر پیش کیا جائے یا NavigationStack کے اندر ہو۔ dismiss سیاق سے خودکار طور پر متعین ہوتا ہے: اگر View ایک sheet کے طور پر کھولی گئی ہے — sheet بند ہوتی ہے، اگر popover کے طور پر — popover بند ہوتا ہے۔
اکثر پوچے جانے والے سوالات
نہیں، @Environment صرف پڑھنے کے لیے ہے۔ قدرتیں بدلنے کے لیے، ObservableObject کے ساتھ @EnvironmentObject یا @Binding استعمال کریں۔ کسٹم EnvironmentKeys میں وسیع میں setter ہو سکتا ہے، لیکن اس کے ذریعے تبدیلی UI اپ ڈیٹ کو متحرک نہیں کرتی — یہ تکنیکی طور پر ممکن ہے لیکن تجویز شدہ نہیں ہے۔
@Binding سچائی کے مخذف (State، StateObject، ObservableObject) کے ساتھ ایک دو طرفہ کنیکشن بناتا ہے۔ @Environment درجہ بند سیاق سے ایک طرفہ پڑھنا ہے۔ @Binding ایک تفریعی View کو ڈیٹا گزارنے کے لیے موزوں ہے، @Environment — سسٹم یا عالمی ترتیبات تک رسائی کے لیے۔
ایک ساخت متعین کریں جو ایک ستاٹک defaultValue کے ساتھ EnvironmentKey پروٹوکول کو نفذ کرتا ہو۔ پھر subscript[key] کے ذریعے getter/setter استعمال کرتے ہوئے EnvironmentValues کو ایک خاصیت سے وسیع کریں۔ رجسٹریشن کے بعد، پڑھنے کے لیے @Environment(\.yourKey) اور مقرر کرنے کے لیے .environment(\.yourKey, value) استعمال کریں۔
SwiftUI 50 سے زائد سسٹم قدرتیں فراہم کرتا ہے: colorScheme, locale, sizeCategory, managedObjectContext, dismiss, calendar, timeZone, horizontalSizeClass, verticalSizeClass, accessibilityEnabled, layoutDirection, legibilityWeight اور دیگر۔ مکمل فہرست EnvironmentValues دستاویز میں۔
ہاں، @Environment Preview میں کام کرتا ہے، لیکن پھلی سے طے کی قدرتیں سیمیولیٹر سے مختلف ہو سکتی ہیں۔ Preview میں جانچنے کے لیے، Preview کوڈ میں براہراست .environment() موڈیفائر استعمال کریں: ThemedView().environment(\.colorScheme, .dark)۔ یہ مختلف ماحول کی حالتوں کی بصری جانچ کی اجازت دیتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں