SwiftUI میں @Environment — یہ کیا ہے، بنیادی مفاہیم اور میکانزم

مصنف: IT Sectr اشاعت: 2026-06-25 مطالعے کا وقت: 8 منٹ

SwiftUI میں @Environment ایک property wrapper ہے جو سسٹم ماحول سے قدرتیں پڑھنے کے لیے، اور View کے درجہ بندی میں خودکار طور پر پھیلائے جاتے ہیں۔ یہ کمپونینٹ رنگ اسکیم، مقامی ترتیبات، فونٹ کا سائز، managedObjectContext اور درجنوں دیگر سسٹم پیرامیٹرز تک رسائی فراہم کرتا ہے۔ Apple Developer Documentation (2025) کے مطابق، @Environment اس بات کی ضمانت دیتا ہے کہ ماحول کی قدرت میں کوئی بھی تبدیلی سب سبسکرائیب شدہ View کو دوبارہ رینڈر کرنے کا سبب بنتی ہے، جو دستی کالز کے بغیر ریاکٹو انٹرفیس اپ ڈیٹ فراہم کرتا ہے۔

اہم نکات

  • @Environment — SwiftUI سسٹم ماحول کی قدرتوں کو پڑھنے کا property wrapper
  • رنگ اسکیم، مقامی ترتیبات اور فونٹ کا سائز عام استعمال کی گی سسٹم قدرتیں ہیں
  • تبدیلی سبسکرائیب شدہ View کی خودکار دوبارہ رینڈرینگ کا سبب بنتی ہے
  • کسٹم کنجیاں EnvironmentKey کے ذریعے اپنی ماحول کی قدرتیں تیار کرنے کی اجازت دیتی ہیں
  • @Environment — صرف پڑھنے کے لیے; @EnvironmentObject — لکھنے کے لیے

SwiftUI میں @Environment کیا ہے?

@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) — مقامی ترتیبات تک رسائی۔

@Environment بحیثیت Property Wrapper

Property wrapper @Environment دو بنیادی میکانزم نفذ کرتا ہے: ماحول سے قدرت پڑھنا اور اس کی تبدیلیوں کی سبسکرائیب۔ جب کئی View تیار ہوتی ہے، SwiftUI تمام @Environment خوصیات سے گزرتا ہے اور انہیں موجودہ سیاق سے متبادل قدرتوں سے منسلک کرتا ہے۔ اگر ایک والد View .environment() موڈیفائر کے ذریعے قدرت بدلتا ہے، تو وہ قدرت پڑھنے والے تمام تفریعی View خودکار طور پر دوبارہ رینڈر ہو جاتے ہیں۔

ایک اہم خصوصیت: @Environment اختیاری قدرتوں کی حمایت کرتا ہے۔ اگر درجہ بندی میں کوئی قدرت مقرر نہیں ہے، تو EnvironmentKey میں متعین کردہ پھلی سے طے کی قدرت واپس کی جاتی ہے۔ سسٹم کنجیوں کے لیے، پھلی سے طے کی قدرت ہمیشہ مناسب ہوتی ہے — مثال کے طور پر، پھلی سے طے کی رنگ اسکیم .light ہے۔ کسٹم کنجیوں کے لیے، ڈیویلپر EnvironmentKey پروٹوکول کے defaultValue طریقے میں پھلی سے طے کی قدرت متعین کرتا ہے۔

swift
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قسممقصد
\.colorSchemeColorSchemeہلکا یا اندھیرا ثیم
\.localeLocaleعلاقائی ترتیبات
\.sizeCategoryContentSizeCategoryDynamic Type فونٹ کا سائز
\.managedObjectContextNSManagedObjectContextCore Data سیاق
\.dismissDismissActionسکرین بند کریں
\.calendarCalendarموجودہ کیلنڈر
\.timeZoneTimeZoneوقتی زون
\.horizontalSizeClassUserInterfaceSizeClassافقی سکرین کا سائز

سسٹم قدرتوں تک رسائی کے لیے، نقطے کے ساتھ key path استعمال کریں: @Environment(\.dismiss) var dismiss۔ کامپائلر EnvironmentValues میں key path کی موجودگی کی جانچ کرتا ہے، اس لیے ایک غلط کنجی کامپائل ٹائم کی غلطی کا سبب بنے گی۔ Apple iOS کے ہر نئے ورزن کے ساتھ نئی سسٹم قدرتیں شامل کرتا ہے — مکمل فہرست EnvironmentValues دستاویز میں دستیاب ہے۔

@Environment بنام @EnvironmentObject

ایک جیسے ناموں کے باوجود، @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 استعمال کریں جب حالت کو تفریعی اجزاء سے ترمیم کرنے کی ضرورت ہو۔

@Environment کوڈ کی مثالیں

ایک کسٹم ماحول قدرت بنانے پر غور کریں۔ ایسا کرنے کے لیے، آپ کو EnvironmentKey پروٹوکول کی پیروی کرنے والی ایک ساخت متعین کرنے اور EnvironmentValues کو ایک نئی خاصیت سے وسیع کرنے کی ضرورت ہے۔ یہ props کے بغیر پورے View درخت میں ثیم ترتیبات یا ایپ سیٹنگز گزارنے کی اجازت دیتا ہے۔

swift
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) کے ذریعے قدرت پڑھ سکتا ہے۔

ایک کسٹم کنجی کے ساتھ @Environment کا استعمال

swift
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 قدرت مقرر کرتا ہے۔

ایک سکرین بند کرنے کے لیے dismiss کا استعمال

swift
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 بند ہوتا ہے۔

اکثر پوچے جانے والے سوالات

کیا میں ایک تفریعی View سے @Environment کی قدرت بدل سکتا ہوں?

نہیں، @Environment صرف پڑھنے کے لیے ہے۔ قدرتیں بدلنے کے لیے، ObservableObject کے ساتھ @EnvironmentObject یا @Binding استعمال کریں۔ کسٹم EnvironmentKeys میں وسیع میں setter ہو سکتا ہے، لیکن اس کے ذریعے تبدیلی UI اپ ڈیٹ کو متحرک نہیں کرتی — یہ تکنیکی طور پر ممکن ہے لیکن تجویز شدہ نہیں ہے۔

@Environment اور @Binding میں کیا فرق ہے?

@Binding سچائی کے مخذف (State، StateObject، ObservableObject) کے ساتھ ایک دو طرفہ کنیکشن بناتا ہے۔ @Environment درجہ بند سیاق سے ایک طرفہ پڑھنا ہے۔ @Binding ایک تفریعی View کو ڈیٹا گزارنے کے لیے موزوں ہے، @Environment — سسٹم یا عالمی ترتیبات تک رسائی کے لیے۔

میں اپنی ماحول قدرت کیسے بناؤں?

ایک ساخت متعین کریں جو ایک ستاٹک defaultValue کے ساتھ EnvironmentKey پروٹوکول کو نفذ کرتا ہو۔ پھر subscript[key] کے ذریعے getter/setter استعمال کرتے ہوئے EnvironmentValues کو ایک خاصیت سے وسیع کریں۔ رجسٹریشن کے بعد، پڑھنے کے لیے @Environment(\.yourKey) اور مقرر کرنے کے لیے .environment(\.yourKey, value) استعمال کریں۔

SwiftUI میں کون سی ماحول قدرتیں دستیاب ہیں?

SwiftUI 50 سے زائد سسٹم قدرتیں فراہم کرتا ہے: colorScheme, locale, sizeCategory, managedObjectContext, dismiss, calendar, timeZone, horizontalSizeClass, verticalSizeClass, accessibilityEnabled, layoutDirection, legibilityWeight اور دیگر۔ مکمل فہرست EnvironmentValues دستاویز میں۔

کیا @Environment Preview میں کام کرتا ہے?

ہاں، @Environment Preview میں کام کرتا ہے، لیکن پھلی سے طے کی قدرتیں سیمیولیٹر سے مختلف ہو سکتی ہیں۔ Preview میں جانچنے کے لیے، Preview کوڈ میں براہراست .environment() موڈیفائر استعمال کریں: ThemedView().environment(\.colorScheme, .dark)۔ یہ مختلف ماحول کی حالتوں کی بصری جانچ کی اجازت دیتا ہے۔

خلاصہ

  • @Environment — key path کے ذریعے SwiftUI سسٹم ماحول کی قدرتوں کو پڑھنے کا property wrapper
  • رنگ اسکیم، مقامی ترتیبات، فونٹ کا سائز اور managedObjectContext سب سے زیادہ استعمال کی جانے والی سسٹم قدرتیں ہیں
  • تبدیلی ماحول قدرت میں سبسکرائیب شدہ تمام View کی خودکار دوبارہ رینڈرینگ کو متحرک کرتی ہے
  • کسٹم EnvironmentKey ایپ کے ماحول کو عالمی ترتیبات کے ساتھ وسیع کرنے کی اجازت دیتا ہے
  • @Environment — صرف پڑھنا; @EnvironmentObject — لیکھنے کی رسائی کے ساتھ ObservableObject کے لیے
  • .environment() موڈیفائر درجہ بندی میں تفریعی View کے لیے قدرت مقرر کرتا ہے
  • استعمال کریں @Environment سسٹم پیرامیٹرز کے لیے، @EnvironmentObject — ViewModel اور سروسز کے لیے

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں