@State — مقصد اور SwiftUI میں استعمال

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

@State SwiftUI میں ایک Property Wrapper ہے جو ایک ہی ویو کے اندر مقامی حالت کو منظم کرنے کے لیے ہے۔ جب بھی @State کی خاصیت بدلتی ہے، SwiftUI خود بخود ویو کو دوبارہ کھینچتا ہے، جس سے انٹرفیس دستی اپ ڈیٹ کالز کے بغیر رد عمل ظاہر کرنے والا بن جاتا ہے۔ Apple Developer Documentation (2025) کے مطابق، @State سادہ اقسام اور ساختوں کے لیے تجویز کیا جاتا ہے جو ایک ہی ویو سے تعلق رکھتی ہیں۔ @State SwiftUI انٹرفیس میں تعامل شامل کرنے کا سب سے آسان طریقہ ہے۔

اہم نکات

  • @State — ایک ہی ویو سے تعلق رکھنے والی مقامی حالت کے لیے Property Wrapper
  • خودکار اپ ڈیٹ — @State خاصیت بدلنے پر SwiftUI body کو دوبارہ کال کرتا ہے
  • سادہ اقسام — @State String، Int، Bool، enum اور struct کے ساتھ کام کرتا ہے
  • چائلڈ ویوز میں نہ دیں — چائلڈ اجزاء سے تبدیلیوں کے لیے @Binding استعمال کریں
  • private — @State خصوصیات ہمیشہ private موڈیفائر کے ساتھ اعلان کی جاتی ہیں

SwiftUI میں @State کیا ہے؟

@State SwiftUI میں شامل ایک Property Wrapper ہے جو ویو کو اپنی حالت محفوظ کرنے اور ٹریک کرنے کی اجازت دیتا ہے۔ جب @State قدر بدلتی ہے، SwiftUI خود بخود body پراپرٹی کو دوبارہ کال کر کے ویو کو دوبارہ کھینچتا ہے۔ یہ SwiftUI میں رد عمل پروگرامنگ کی بنیاد ہے: ڈیولپر حالت کا اعلان کرتا ہے، اور فریم ورک انٹرفیس کی مطابقت سنبھالتا ہے۔

@State SwiftUI کے زیر انتظام ہیپ پر ایک ذخیرہ علاقہ بناتا ہے۔ یہ علاقہ مستقل ہے — یہ ویو سٹرکٹ کی بار بار شروع ہونے والی ابتداء سے بچ جاتا ہے، جو ہر رینڈر پر ہوتی ہیں۔ SwiftUI @State خاصیت کو کسی مخصوص ویو سے باندھنے کے لیے ویو کی شناخت (درجہ بندی میں اس کی پوزیشن سے پیدا کردہ) استعمال کرتا ہے۔ اس کی بدولت، جب والدین ویو اپ ڈیٹ ہوتا ہے تو حالت دوبارہ سیٹ نہیں ہوتی۔

ایک اہم حد: @State صرف قدر کی اقسام (struct، enum، بنیادی اقسام) کے لیے ہے۔ حوالہ جاتی اقسام (کلاسز) کے لیے @StateObject یا @ObservedObject استعمال کریں۔ اگر آپ @State خاصیت کو ایک کلاس تفویض کرتے ہیں، SwiftUI آبجیکٹ کے اندر تبدیلیوں کا پتہ نہیں لگا سکے گا — صرف حوالہ کی مکمل تبدیلی۔

@State پردے کے پیچھے کیسے کام کرتا ہے؟

SwiftUI @State کو اندرونی Storage میکانزم کے ذریعے نافذ کرتا ہے۔ ہر @State خاصیت ویو کے ایک خاص ذخیرہ کنٹینر میں محفوظ ایک مختص میموری سیل حاصل کرتی ہے۔ جب wrappedValue میں لکھائی ہوتی ہے، SwiftUI didSet کے ذریعے اپنے انحصار گراف کو دوبارہ کھینچنے کی ضرورت سے آگاہ کرتا ہے۔

swift
struct ContentView: View {
    @State private var name: String = "User"
    @State private var isLoggedIn: Bool = false

    var body: some View {
        VStack {
            Text("ہیلو، \(name)")
            Button(isLoggedIn ? "لاگ آؤٹ" : "لاگ ان") {
                isLoggedIn.toggle()
            }
        }
    }
}

مثال میں، دو @State خصوصیات ہیں: name (String) اور isLoggedIn (Bool)۔ جب isLoggedIn.toggle() کال کیا جاتا ہے، SwiftUI ContentView کو اپ ڈیٹ کی ضرورت کے طور پر نشان زد کرتا ہے اور اگلے رینڈر سائیکل میں body کو دوبارہ کال کرتا ہے۔ اہم نکتہ: @State خصوصیات ہمیشہ private موڈیفائر کے ساتھ اعلان کی جاتی ہیں — یہ اشارہ کرتا ہے کہ حالت صرف موجودہ ویو کی ہے اور باہر سے براہ راست تبدیل نہیں کی جانی چاہیے۔

تبدیلیوں کا مشاہدہ کرنے کے لیے، SwiftUI Combine سے CurrentValueSubject استعمال کرتا ہے۔ ہر @State خاصیت ایک پوشیدہ پبلشر بناتی ہے جو ہر تبدیلی پر سسٹم کو مطلع کرتا ہے۔ یہ SwiftUI کو صرف کم سے کم ضروری ویو سیٹ کو دوبارہ کھینچنے کی اجازت دیتا ہے، مکمل درجہ بندی اپ ڈیٹ سے بچتا ہے۔

پروجیکٹ میں @State کب استعمال کریں

@State سادہ مقامی حالات کے لیے بہترین ہے: تلاش میں ٹیکسٹ فیلڈز، موڈل ونڈوز کے لیے بولین فلیگز، سیٹنگ ٹوگلز، کاؤنٹرز، منتخب فہرست آئٹمز۔ اگر کوئی قدر صرف ایک ویو اور اس کے چائلڈ اجزاء (@Binding کے ذریعے) میں استعمال ہوتی ہے، @State صحیح انتخاب ہے۔ ان حالات کے لیے جو ویو بند ہونے کے بعد بھی برقرار رہنے چاہئیں (مثلاً فارم ڈیٹا)، @State اس وقت تک کام کرتا ہے جب تک ویو درجہ بندی میں رہتا ہے۔

  • ٹیکسٹ فیلڈز — TextField میں داخل کردہ متن محفوظ کرنے کے لیے @State
  • بولین فلیگز — موڈل ونڈوز اور شیٹس دکھانے/چھپانے کے لیے @State
  • عنصر انتخاب — منتخب ٹیب یا قطار کو ٹریک کرنے کے لیے @State
  • کاؤنٹرز — اضافہ/کمی کے ساتھ عددی قدروں کے لیے @State
  • درمیانی حسابات — ویو کے اندر نتائج کیش کرنے کے لیے @State

@State کو عالمی ایپلیکیشن حالات، نیٹ ورک ڈیٹا کیشنگ، یا متعدد اسکرینوں پر استعمال ہونے والی اشیاء کے لیے استعمال نہ کریں۔ @StateObject اور @EnvironmentObject ان مقاصد کے لیے ڈیزائن کیے گئے ہیں۔ نیز، @State بڑی مقدار میں ڈیٹا ذخیرہ کرنے کے لیے موزوں نہیں ہے — ہر تبدیلی پورے ویو کو دوبارہ کھینچے گی۔

@State اور @Binding: ایک ساتھ کام کرنا

@Binding والدین ویو میں @State اور چائلڈ ویو کے درمیان ایک پل ہے جسے اس حالت کو تبدیل کرنے کی ضرورت ہے۔ والدین @State کا اعلان کرتا ہے، اور چائلڈ جزو $ پروجیکشن کے ذریعے Binding حاصل کرتا ہے۔ چائلڈ ویو میں Binding تبدیل کرنے سے والدین میں @State خود بخود اپ ڈیٹ ہو جاتا ہے — اور اس کے برعکس۔ یہ فیڈ بیک کی اہلیت کے ساتھ یک طرفہ ڈیٹا بہاؤ کو یقینی بناتا ہے۔

swift
struct ParentView: View {
    @State private var text: String = ""

    var body: some View {
        ChildView(text: $text)
    }
}

struct ChildView: View {
    @Binding var text: String

    var body: some View {
        TextField("Enter text", text: $text)
    }
}

فہرست میں، ParentView کے پاس @State text ہے، اور ChildView $text کو Binding کے طور پر حاصل کرتا ہے۔ ChildView کے اندر TextField text: $text کے ذریعے اس Binding سے منسلک ہوتا ہے۔ جب صارف TextField میں ٹائپ کرتا ہے، Binding کے ذریعے ChildView میں قدر بدلتی ہے، جو ParentView میں @State کی اپ ڈیٹ کا سبب بنتی ہے۔ دونوں ویوز نئی قدر کے ساتھ دوبارہ کھینچی جاتی ہیں۔

@State کے ساتھ کام کرتے وقت عام غلطیاں

سب سے عام غلطی @State خاصیت کو ایک کلاس تفویض کرنا ہے۔ اگر آپ @State var model = MyClass() لکھتے ہیں، SwiftUI کلاس کے اندر خصوصیات میں تبدیلیوں کو ٹریک نہیں کر سکے گا — صرف آبجیکٹ کی تبدیلی۔ کلاسز کے لیے، ہمیشہ @StateObject استعمال کریں۔ دوسرا عام مسئلہ private موڈیفائر کے بغیر @State کا اعلان کرنا ہے، جو حالت کی encapsulation کی خلاف ورزی کرتا ہے۔

$ کے بغیر براہ راست @State پاس کرنا چائلڈ ویو میں ایک اور عام غلطی ہے۔ اگر آپ TextField(text: $text) کے بجائے TextField(text: text) پاس کرتے ہیں، چائلڈ جزو صرف ایک سٹرنگ حاصل کرتا ہے، Binding نہیں۔ TextField میں متن کی تبدیلیاں والدین کے @State کے ساتھ مطابقت پذیر نہیں ہوں گی۔ Binding پاس کرنے کے لیے ہمیشہ $ پروجیکشن استعمال کریں۔

تیسری غلطی متعلقہ ڈیٹا کے لیے متعدد @State خصوصیات ہے۔ اگر متعدد قدریں منطقی طور پر ایک مکمل تشکیل دیتی ہیں (مثلاً فارم فیلڈز)، انہیں ایک واحد @State کے ساتھ ایک سٹرکٹ میں یکجا کریں۔ یہ چائلڈ ویوز میں حالت پاس کرنے کو آسان بناتا ہے اور انفرادی اپ ڈیٹ ٹرگرز کی تعداد کو کم کرتا ہے۔

SwiftUI میں @State استعمال کی مثالیں

@State زیادہ تر SwiftUI پروجیکٹس میں بنیادی تعامل کے لیے استعمال ہوتا ہے۔ ایک لاگ ان فارم کی مثال پر غور کریں جہاں @State ٹیکسٹ فیلڈز اور لوڈنگ حالت کا انتظام کرتا ہے۔ یہ پیٹرن ہر ایپلیکیشن میں ظاہر ہوتا ہے — سادہ نوٹس سے لے کر پیچیدہ کارپوریٹ حل تک۔

swift
struct LoginView: View {
    @State private var email: String = ""
    @State private var password: String = ""
    @State private var isLoading: Bool = false
    @State private var errorMessage: String?

    var body: some View {
        Form {
            TextField("Email", text: $email)
            SecureField("Password", text: $password)
            Button("لاگ ان") {
                login()
            }.disabled(isLoading)
        }
    }

    private func login() {
        isLoading = true
        // نیٹ ورک کی درخواست انجام دیں
    }
}

مثال میں، چار @State خصوصیات ہیں: فارم فیلڈز کے لیے email اور password، لوڈنگ اشارے کے لیے isLoading، اور غلطیاں ظاہر کرنے کے لیے errorMessage۔ ہر خاصیت آزادانہ طور پر انٹرفیس کے اپنے حصے کا انتظام کرتی ہے۔ جب isLoading بدلتا ہے، بٹن disabled(isLoading) کے ذریعے خود بخود غیر فعال ہو جاتا ہے — دستی UI اپ ڈیٹ کے بغیر۔

اکثر پوچھے گئے سوالات

@State private کے ساتھ کیوں اعلان کیا جاتا ہے؟

@State کسی مخصوص ویو کی مقامی حالت کے لیے ڈیزائن کیا گیا ہے۔ private موڈیفائر یقینی بناتا ہے کہ دوسرے اجزاء اسے براہ راست تبدیل نہ کر سکیں، encapsulation کو توڑتے ہوئے۔ بیرونی رسائی کے لیے $ پروجیکشن استعمال کریں۔

کیا @State میں اری یا ڈکشنری ہو سکتی ہے؟

ہاں، @State اریوں اور ڈکشنریوں کو سپورٹ کرتا ہے کیونکہ یہ قدر کی اقسام ہیں۔ تاہم، جب اری کا کوئی عنصر بدلتا ہے، SwiftUI پورے ویو کو دوبارہ کھینچتا ہے۔ بڑی فہرستوں کے لیے @Published کے ساتھ @StateObject زیادہ موثر ہے۔

Optional قسم کی @State خاصیت کو nil تفویض کرنے پر کیا ہوتا ہے؟

@State Optional اقسام کے ساتھ صحیح کام کرتا ہے۔ nil تفویض کرنے پر، SwiftUI تبدیلی کا پتہ لگاتا ہے اور ویو کو دوبارہ کھینچتا ہے۔ یہ errorMessage: String? جیسی حالتوں کے لیے آسان ہے، جہاں nil کا مطلب کوئی غلطی نہیں ہے۔

ویو کے دوبارہ ظاہر ہونے پر @State کیسا برتاؤ کرتا ہے؟

@State اس وقت تک قدر محفوظ رکھتا ہے جب تک ویو درجہ بندی میں رہتا ہے۔ اگر ویو درجہ بندی سے ہٹا کر دوبارہ شامل کیا جائے، @State ڈیفالٹ قدر کے ساتھ دوبارہ شروع ہوتا ہے۔ استحکام کے لیے @AppStorage استعمال کریں۔

کیا @State کی تبدیلیوں کو متحرک کیا جا سکتا ہے؟

ہاں، تبدیلی کو withAnimation میں لپیٹیں: withAnimation(.easeInOut) { isExpanded.toggle() }. SwiftUI مخصوص اینیمیشن قسم کے ساتھ پرانی اور نئی انٹرفیس حالت کے درمیان منتقلی کو متحرک کرتا ہے۔

خلاصہ

  • @State — ایک ویو کی مقامی حالت کے لیے Property Wrapper، خود بخود انٹرفیس اپ ڈیٹ کرتا ہے
  • کام کرتا ہے سادہ اقسام کے ساتھ: String، Int، Bool، نیز struct اور enum
  • کام نہیں کرتا حوالہ جاتی اقسام (کلاسز) کے ساتھ — @StateObject استعمال کریں
  • ہمیشہ private — حالت باہر سے براہ راست تبدیل نہیں کی جانی چاہیے
  • $ پروجیکشن — چائلڈ ویوز کو تبدیلی کا حق دینے کے لیے Binding بناتا ہے
  • متعدد @State ایک ویو میں — آزاد حالات کے لیے معمول کی مشق
  • withAnimation — @State خصوصیات میں تبدیلیوں کو متحرک کرنے کی اجازت دیتا ہے

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

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

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

مزید پڑھیں