@Binding — یہ کیا ہے، کیسے کام کرتا ہے اور SwiftUI میں مثالیں

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

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

اہم نکات

  • @Binding — پیرنٹ ویو کی حالت کا حوالہ بنانے کے لیے Property Wrapper
  • کوئی ملکیت نہیں — Binding ڈیٹا ذخیرہ نہیں کرتا، صرف سچائی کے ماخذ تک رسائی فراہم کرتا ہے
  • $ پروجیکشن — $stateValue @State یا @StateObject سے Binding بناتا ہے
  • دو طرفہ بائنڈنگ — چائلڈ ویو میں تبدیلیاں فوراً پیرنٹ میں ظاہر ہوتی ہیں
  • Binding.constant — فیڈبیک کے بغیر پروٹوٹائپنگ کے لیے مقررہ قدر

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

@Binding ایک Property Wrapper ہے جو پیرنٹ ویو میں محفوظ کردہ پراپرٹی اور چائلڈ جزو کے درمیان دو طرفہ کنکشن بناتا ہے۔ Binding اور @State کے درمیان بنیادی فرق: Binding ڈیٹا کا مالک نہیں ہے۔ یہ صرف حقیقی ماخذ — @State، @StateObject یا پیرنٹ میں کسی اور Binding — کے ذریعے قدریں پڑھتا اور لکھتا ہے۔ Binding کے بغیر، چائلڈ ویوز کال بیکس یا ڈیلیگیٹس کے بغیر آباؤاجداد کی حالت میں تبدیلی نہیں کر سکتی تھیں۔

Binding دو خصوصیات کے ساتھ ایک ساخت کے طور پر لاگو کیا گیا ہے: wrappedValue (موجودہ قدر) اور projectedValue (خود Binding، $ کے ذریعے قابل رسائی)۔ جب چائلڈ ویو Binding کے ذریعے wrappedValue کو تبدیل کرتی ہے، SwiftUI ڈیٹا ماخذ میں تبدیلی منتقل کرتا ہے اور تمام منحصر ویوز کو دوبارہ کھینچتا ہے۔ یہ موجودہ اپ ڈیٹ سائیکل کے اندر ہم وقت سازی سے ہوتا ہے۔

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

Binding کی دو طرفہ بائنڈنگ کیسے کام کرتی ہے

@Binding کے ذریعے دو طرفہ بائنڈنگ کا طریقہ کار Property Wrapper پروجیکشنز پر بنایا گیا ہے۔ جب پیرنٹ @State var value: T کا اعلان کرتا ہے، SwiftUI خود بخود Binding<T> قسم کا $value پروجیکشن تیار کرتا ہے۔ $value کو @Binding var value: T والے چائلڈ جزو میں منتقل کرکے، آپ دونوں ویوز کو ایک ہی میموری سیل سے جوڑتے ہیں۔ چائلڈ ویو میں Binding کے ذریعے کوئی بھی تحریر دونوں اجزاء کی دوبارہ ڈرائنگ کو متحرک کرتی ہے۔

swift
struct SliderContainer: View {
    @State private var value: Double = 0.5

    var body: some View {
        VStack {
            Text("Value: \(value)")
            SliderView(value: $value)
        }
    }
}

struct SliderView: View {
    @Binding var value: Double

    var body: some View {
        Slider(value: $value, in: 0...1)
    }
}

مثال میں، SliderContainer @State value کا مالک ہے، اور SliderView $value کے ذریعے Binding حاصل کرتا ہے۔ SliderView کے اندر Slider اس Binding سے باؤنڈ ہے۔ سلائیڈر کو گھسیٹنے پر، Slider Binding کے ذریعے قدر تبدیل کرتا ہے، جو خود بخود SliderContainer میں @State کو اپ ڈیٹ کرتا ہے، اور دونوں ویوز موجودہ نمبر دکھاتی ہیں۔ پوری زنجیر ایک بھی کال بیک یا اطلاع کے بغیر کام کرتی ہے۔

@StateObject یا @ObservedObject سے Binding بنانے کے لیے، وہی پروجیکشن استعمال ہوتا ہے: $object.property Binding<PropertyType> دیتا ہے۔ یہ پورے آبجیکٹ کو منتقل کیے بغیر ObservableObject کی انفرادی خصوصیات کو چائلڈ ویوز میں منتقل کرنے کی اجازت دیتا ہے۔ یہ طریقہ زیادہ تنگ جوڑ فراہم کرتا ہے اور غیر ضروری دوبارہ ڈرائنگ کو روکتا ہے۔

@Binding بمقابلہ کال بیکس: کیا منتخب کریں

SwiftUI سے پہلے، درجہ بندی میں اوپر تبدیلیاں منتقل کرنے کا معیاری طریقہ کال بیکس اور ڈیلیگیٹس تھا: پیرنٹ ایک closure منتقل کرتا تھا، چائلڈ جزو تبدیلی پر اسے پکارتا تھا۔ @Binding کم کوڈ اور زیادہ اعلانیہ نحو کے ساتھ ایک متبادل پیش کرتا ہے۔ تکمیلی closure منتقل کرنے کے بجائے، آپ صرف $stateValue منتقل کرتے ہیں۔

معیار@Bindingکال بیکس
کوڈایک تشریح + $Closure + پکار
کثیر سطحیخودکارClosure سلسلہ
جانچBinding(value:constant)نقلی Closure
پڑھنے کی اہلیتاعلیدرمیانی
لچکصرف ڈیٹاکوئی بھی منطق

@Binding استعمال کریں جب چائلڈ ویو کو صرف قدر پڑھنے اور تبدیل کرنے کی ضرورت ہو۔ اگر تبدیلی پر ضمنی اثرات درکار ہوں (توثیق، لاگنگ، نیٹ ورک کی درخواست)، Binding کو کال بیک کے ساتھ جوڑیں: ڈیٹا کے لیے Binding اور واقعات کے لیے closure منتقل کریں۔ مثال کے طور پر، ایک TextField Binding سے باؤنڈ ہو سکتا ہے، جبکہ onChange توثیق کو متحرک کرتا ہے۔

منصوبوں میں @Binding کے استعمال کے پیٹرن

@Binding کئی عام منظرناموں میں استعمال ہوتا ہے۔ پہلا — کسٹم کنٹرولز: سوئچز، سلائیڈرز، کلر پکرز اور دیگر انٹرایکٹو عناصر دو طرفہ ہم آہنگی کے لیے Binding قبول کرتے ہیں۔ دوسرا — موڈل ونڈوز: شیٹ ڈسپلے فلیگ Binding کے طور پر منتقل کیا جاتا ہے، جس سے چائلڈ ویو presentationMode یا براہ راست سیٹنگ کے ذریعے خود کو بند کر سکتی ہے۔

تیسرا پیٹرن — علیحدگی کے ساتھ فارم۔ اگر ایک فارم کئی فیلڈز پر مشتمل ہے، تو ہر فیلڈ کو ایک الگ جزو میں نکالا جا سکتا ہے جو اس کی قدر کے لیے Binding قبول کرتا ہے۔ یہ مختلف فارمز میں فیلڈز کی جانچ اور دوبارہ استعمال کو آسان بناتا ہے۔ پیرنٹ جزو پورے فارم ماڈل کا واحد مالک رہتا ہے۔

swift
struct FormField: View {
    let title: String
    @Binding var text: String

    var body: some View {
        VStack(alignment: .leading) {
            Text(title).font(.caption)
            TextField("Enter \(title.lowercased())", text: $text)
                .textFieldStyle(.roundedBorder)
        }
    }
}

FormField جزو ایک عنوان اور ایک سٹرنگ کے لیے Binding قبول کرتا ہے۔ یہ ایک لیبل اور منتقل کردہ Binding سے باؤنڈ TextField دکھاتا ہے۔ کوئی بھی فارم ہر فیلڈ کے لیے $property منتقل کرکے FormField کو کئی بار استعمال کر سکتا ہے۔ یہ مارک اپ کی نقل کو کم کرتا ہے اور ٹیکسٹ فیلڈ اسٹائلنگ کو مرکزی بناتا ہے۔

کسٹم Binding بنانا

SwiftUI Binding(get:set:) انیشیالائزر کے ذریعے دستی طور پر Binding بنانے کی اجازت دیتا ہے۔ یہ مفید ہے جب قدر پڑھنے یا لکھنے پر منطق شامل کرنے کی ضرورت ہو۔ مثال کے طور پر، ایک Binding بنایا جا سکتا ہے جو محفوظ کرنے سے پہلے نمبر کو فارمیٹ کرتا ہے، یا ایک Binding جو ہر تبدیلی پر قدر کو دور دراز سرور سے ہم آہنگ کرتا ہے۔

swift
struct ValidatedField: View {
    @State private var email: String = ""

    var emailBinding: Binding<String> {
        .init(
            get: { email },
            set: { email = $0.lowercased().trimmingCharacters(in: .whitespaces) }
        )
    }

    var body: some View {
        TextField("Email", text: emailBinding)
    }
}

فہرست میں، کسٹم emailBinding ہر تبدیلی پر خود بخود متن کو چھوٹے حروف میں بدل دیتا ہے اور خالی جگہیں ہٹا دیتا ہے۔ TextField $email سے براہ راست باؤنڈ ہونے کے بجائے اس Binding کو استعمال کرتا ہے۔ یہ طریقہ onChange ہینڈلرز سے کوڈ کو بے ترتیب کیے بغیر Binding کے اندر توثیق اور ڈیٹا کی تبدیلی کو مرکزی بناتا ہے۔

@Binding کے ساتھ غلطیاں اور مخالف پیٹرن

پہلی اور سب سے عام غلطی Binding کے بجائے قدر منتقل کرنا ہے۔ اگر چائلڈ جزو @Binding var text: String کا اعلان کرتا ہے، اور پیرنٹ text ($ کے بغیر) منتقل کرتا ہے، تو کمپائلر غلطی دے گا: Cannot convert value of type 'String' to expected argument type 'Binding<String>'. حل — منتقل کرتے وقت ہمیشہ $ سابقہ استعمال کریں: $text۔

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

تیسرا مسئلہ — پیداوار میں Binding.constant۔ Binding.constant(value) فیڈبیک کے بغیر ایک جعلی بائنڈنگ بناتا ہے — تبدیلیاں نظر انداز کر دی جاتی ہیں۔ constant کو صرف پروٹوٹائپنگ اور پیش نظارہ (Xcode Previews) کے لیے استعمال کریں، لیکن حقیقی کوڈ میں کبھی نہیں۔ ٹیسٹوں کے لیے، کنٹرول شدہ رویے کے ساتھ Binding(get:set:) استعمال کریں۔

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

@Binding اور @State میں کیا فرق ہے؟

@State ڈیٹا کا مالک ہے اور ہیپ میں اس کے ذخیرہ کا انتظام کرتا ہے۔ @Binding ملکیت کے بغیر صرف موجودہ حالت کا حوالہ دیتا ہے۔ @State ہمیشہ نجی ہوتا ہے، @Binding چائلڈ ویو کا ان پٹ پیرامیٹر ہے۔

کیا @State کے بغیر Binding بنایا جا سکتا ہے؟

ہاں، Binding(get:set:) انیشیالائزر یا Binding.constant(value) کے ذریعے۔ Binding @StateObject سے $object.$property پروجیکشن اور Publisher سے Subscribe کے اندر Binding(get:set:) کے ذریعے بھی حاصل کیا جا سکتا ہے۔

متعدد درجہ بندی کی سطحوں کے ذریعے Binding کیسے منتقل کریں؟

@Binding ایک سلسلہ کے ذریعے منتقل ہوتا ہے: ہر درمیانی جزو @Binding کا اعلان کرتا ہے اور اسے $ کے ذریعے آگے منتقل کرتا ہے۔ تمام سطحیں روٹ ویو میں ایک ہی ڈیٹا ماخذ کا حوالہ دیتی ہیں۔

Binding.constant انٹرفیس کو اپ ڈیٹ کیوں نہیں کرتا؟

Binding.constant ایک خاموش لفافہ بناتا ہے — سیٹر نئی قدروں کو نظر انداز کرتا ہے۔ یہ صرف پروٹوٹائپنگ اور SwiftUI Previews کے لیے ہے جہاں چائلڈ جزو سے فیڈبیک کی ضرورت نہیں ہوتی۔

کیا @Binding اختیاری ہو سکتا ہے؟

ہاں، Binding<T?> تعاون یافتہ ہے۔ اگر آپ Binding<String?> منتقل کرتے ہیں، تو چائلڈ ویو nil سیٹ کر سکے گی۔ یہ اختیاری فارم فیلڈز یا ری سیٹ آپشن والی حالتوں کے لیے آسان ہے۔

خلاصہ

  • @Binding — پیرنٹ ویو ڈیٹا کے ساتھ دو طرفہ بائنڈنگ کے لیے Property Wrapper
  • مالک نہیں ہے ڈیٹا کا — صرف سچائی کے ماخذ تک رسائی فراہم کرتا ہے
  • $ پروجیکشن @State، @StateObject کو چائلڈ ویوز میں منتقل کرنے کے لیے Binding میں بدل دیتا ہے
  • کسٹم Binding اضافی منطق کے ساتھ Binding(get:set:) کے ذریعے بنایا گیا
  • Binding.constant — صرف پیش نظارہ اور پروٹوٹائپ کے لیے
  • کثیر سطحی منتقلی — Binding کسی بھی درجہ بندی کی گہرائی سے گزرتا ہے
  • کال بیکس کا متبادل — چائلڈ اجزاء سے حالت تبدیل کرنے کا اعلانیہ طریقہ

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

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

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

مزید پڑھیں