Property Wrapper: بنیادی تصورات، نحو اور SwiftUI میں مثالیں

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

Property Wrapper ایک Swift میکانزم ہے جو کوڈ کو نقل کیے بغیر پراپرٹیز تک رسائی اور ترمیم میں منطق کی ایک پرت شامل کرتا ہے۔ SwiftUI میں، Property Wrappers ویوز کی حالت کے انتظام کی بنیاد بن گئے: @State، @Binding، @ObservedObject، @StateObject اور @Environment۔ Swift دستاویزات (2025) کے مطابق، پراپرٹی ریپرز پروجیکٹس میں بوائلرپلیٹ کوڈ کو اوسطاً 40% کم کرتے ہیں۔ Property Wrapper کو سمجھنا ہر iOS ڈویلپر کے لیے فریم ورک کے ساتھ مؤثر طریقے سے کام کرنے کے لیے ضروری ہے۔

اہم نکات

  • Property Wrapper — Swift کا ایک نحوی تعمیر جو پراپرٹی کے گیٹر اور سیٹر میں منطق شامل کرتا ہے
  • @State — ایک ویو سے تعلق رکھنے والی مقامی حالت کے لیے ریپر
  • @Binding — پیرنٹ ویو سے ڈیٹا ماخذ کے ساتھ دو طرفہ تعلق
  • @ObservedObject — ملکیت کے بغیر بیرونی ObservableObject کا مشاہدہ
  • @StateObject — موجودہ ویو کی سطح پر ObservableObject کی تخلیق اور ملکیت

Property Wrapper کیا ہے؟

Property Wrapper — Swift زبان کا ایک تعمیر، جو ورژن 5.1 میں متعارف کرایا گیا، جو پراپرٹی تک رسائی کی منطق کو ایک علیحدہ قسم میں سمیٹنے کی اجازت دیتا ہے۔ ہر کلاس میں بار بار گیٹر اور سیٹر لکھنے کے بجائے، ڈویلپر ایک بار ریپر کا اعلان کرتا ہے اور قسم سے پہلے @ تشریح کے ذریعے اسے لاگو کرتا ہے۔ Swift خود بخود پراپرٹی کو مخصوص قسم میں لپیٹ دیتا ہے، پڑھنے اور لکھنے پر اس کے wrappedValue اور projectedValue طریقوں کو کال کرتا ہے۔ Apple (WWDC 2019) کے مطابق، Property Wrappers SwiftUI کے لیے ایک اہم تجرید بن گئے۔

ایک پراپرٹی ریپر @propertyWrapper وصف کے ساتھ ایک struct یا class ہے۔ اندر، ایسی قسم کو wrappedValue پراپرٹی کو نافذ کرنا چاہیے، جو حقیقی قدر لوٹاتی اور سیٹ کرتی ہے۔ Swift کمپائلر اصل پراپرٹی تک رسائی کو wrappedValue کالز سے بدل دیتا ہے، کال کرنے والے کوڈ سے عملدرآمد کو مکمل طور پر چھپا دیتا ہے۔ اضافی طور پر، projectedValue کی تعریف کی جا سکتی ہے — $ علامت کے ذریعے قابل رسائی ایک پروجیکشن۔

Property Wrappers کا فائدہ منطق کے دوبارہ استعمال میں ہے۔ مثال کے طور پر، آپ ای میل کی تصدیق، قدروں کو کیش کرنے یا اسٹوریج کے ساتھ ہم آہنگی کے لیے ایک ریپر بنا سکتے ہیں — اور اسے پروجیکٹ کی کسی بھی پراپرٹی پر لاگو کر سکتے ہیں۔ SwiftUI میں، یہ تصور ہر جگہ استعمال ہوتا ہے: حالت کے انتظام کا ہر طریقہ کار ایک علیحدہ Property Wrapper کے طور پر نافذ کیا گیا ہے۔

Swift میں Property Wrapper کیسے کام کرتا ہے؟

@WrapperType var value: T تشریح کے ساتھ پراپرٹی کا اعلان کرتے وقت، Swift کمپائلر کوڈ کو تبدیل کرتا ہے۔ یہ WrapperType کی ایک مثال بناتا ہے اور wrappedValue کے ذریعے پراپرٹی تک رسائی پیدا کرتا ہے۔ سورس کوڈ let x = value، let x = _value.wrappedValue میں بدل جاتا ہے، اور value = newValue، _value.wrappedValue = newValue میں۔ یہ تبدیلی مرتب وقت پر ہوتی ہے، رن ٹائم اوور ہیڈ کے بغیر۔

swift
@propertyWrapper
struct Capitalized {
    private var text: String

    var wrappedValue: String {
        get { text }
        set { text = newValue.capitalized }
    }

    init(initialValue: String) {
        text = initialValue.capitalized
    }
}

فہرست میں Capitalized ریپر دکھایا گیا ہے، جو خود بخود ایک سٹرنگ کو بڑے حروف والے فارمیٹ میں بدل دیتا ہے۔ قیمت تفویض کرتے وقت، سیٹر محفوظ کرنے سے پہلے capitalized کو کال کرتا ہے۔ اب @Capitalized تشریح والی کوئی بھی پراپرٹی صرف درست فارمیٹ شدہ متن ذخیرہ کرے گی۔ یہ نقطہ نظر تصدیق اور فارمیٹنگ کوڈ کی نقل کو مکمل طور پر ختم کرتا ہے۔

پروجیکشن (projectedValue) — $ سابقہ کے ذریعے قابل رسائی ایک اضافی مواصلاتی چینل۔ SwiftUI میں، یہ خصوصیت ہر جگہ استعمال ہوتی ہے: $state Binding دیتا ہے، اور $observedObject Published.Publisher لوٹاتا ہے۔ پروجیکشن ریپر کو قدر تک بنیادی رسائی کو تبدیل کیے بغیر ایک توسیعی انٹرفیس فراہم کرنے کی اجازت دیتا ہے۔

SwiftUI میں اہم Property Wrappers

SwiftUI میں حالت کے انتظام کے لیے پانچ بلٹ ان Property Wrappers شامل ہیں: @State، @Binding، @ObservedObject، @StateObject اور @Environment۔ ہر ایک ایک مخصوص کام حل کرتا ہے اور مختلف منظرناموں میں استعمال ہوتا ہے۔ @State سادہ مقامی ڈیٹا کے لیے، @Binding — چائلڈ ویوز میں ڈیٹا کا حوالہ دینے کے لیے، @ObservedObject اور @StateObject — پیچیدہ اشیاء کے لیے، @Environment — درجہ بندی سے نظام کی قدروں کے لیے ہے۔

ریپرمقصدملکیت
@Stateایک ویو کی مقامی حالتموجودہ ویو
@Bindingوالدین کے ساتھ دو طرفہ تعلقپیرنٹ ویو
@ObservedObjectبیرونی شے کا مشاہدہبیرونی مالک
@StateObjectObservableObject بناناموجودہ ویو
@Environmentدرجہ بندی سے نظام کی قدریںSwiftUI ماحول

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

@State: ویو کی مقامی حالت

@State ایک ویو کے اندر مقامی حالت ذخیرہ کرنے کے لیے Property Wrapper ہے۔ SwiftUI @State پراپرٹیز کے لیے میموری کا خود بخود انتظام کرتا ہے اور ہر تبدیلی پر ویو کو دوبارہ پینٹ کرتا ہے۔ @State سادہ اقسام (String, Int, Bool, enum) اور ڈھانچوں کے لیے موزوں ہے جو خصوصی طور پر موجودہ ویو سے تعلق رکھتے ہیں۔ جب قدر بدلتی ہے، SwiftUI body پراپرٹی کو دوبارہ چلاتا ہے۔

swift
struct CounterView: View {
    @State private var count: Int = 0

    var body: some View {
        VStack {
            Text("گنتی: \(count)")
            Button("اضافہ") {
                count += 1
            }
        }
    }
}

مثال میں، @State پراپرٹی count کاؤنٹر کی موجودہ قدر کو ذخیرہ کرتی ہے۔ SwiftUI اس پراپرٹی کے لیے ہیپ پر ایک ذخیرہ کرنے کی جگہ بناتا ہے اور اسے CounterView کی زندگی کے دور سے جوڑتا ہے۔ بٹن دبانے پر، count 1 بڑھ جاتا ہے، SwiftUI تبدیلی کا پتہ لگاتا ہے اور body کو دوبارہ چلا کر نئی قدر دکھاتا ہے۔ اہم: @State پیچیدہ حوالہ اقسام کے لیے استعمال نہیں ہونا چاہیے — اس کے لیے @StateObject اور @ObservedObject ہیں۔

@Binding: ویوز کے درمیان دو طرفہ تعلق

@Binding دوسرے ویو سے تعلق رکھنے والے ڈیٹا ماخذ کا حوالہ بناتا ہے۔ Binding خود قدر ذخیرہ نہیں کرتا — یہ @State، @StateObject یا پیرنٹ سے منتقل کردہ کسی دوسرے Binding کے ذریعے ڈیٹا پڑھتا اور لکھتا ہے۔ یہ چائلڈ اجزاء کو ڈیٹا کی براہ راست ملکیت کے بغیر اور کال بیک کے بغیر آباؤاجداد کی حالت کو تبدیل کرنے کی اجازت دیتا ہے۔

swift
struct ToggleSwitch: View {
    @Binding var isOn: Bool

    var body: some View {
        Toggle("Switch", isOn: $isOn)
    }
}

فہرست میں، ToggleSwitch پیرنٹ ویو سے @BindingBool وصول کرتا ہے۔ پیرنٹ @State var isToggleOn = false بناتا ہے اور $isToggleOn کو ToggleSwitch کے ابتدا کار میں منتقل کرتا ہے۔ جب صارف چائلڈ ویو کے اندر ٹوگل سوئچ کرتا ہے، تبدیلی فوری طور پر پیرنٹ کے @State میں جھلکتی ہے۔ Binding میکانزم درجہ بندی میں اوپر کی طرف تبدیلیاں منتقل کرنے کے لیے مندوبین یا closures کی ضرورت کو مکمل طور پر ختم کرتا ہے۔

@ObservedObject اور @StateObject: بیرونی ڈیٹا

@ObservedObject باہر سے منتقل کردہ ObservableObject مثال کا مشاہدہ کرنے کے لیے Property Wrapper ہے۔ ویو اس شے کا مالک نہیں ہے — یہ پیرنٹ جزو میں بنائی جاتی ہے یا Environment کے ذریعے داخل کی جاتی ہے۔ جب ObservableObject کے اندر کوئی @Published پراپرٹی بدلتی ہے، SwiftUI @ObservedObject کے ذریعے سبسکرائب کردہ تمام ویوز کو دوبارہ پینٹ کرتا ہے۔

@StateObject — براہ راست ویو میں ObservableObject بنانے اور اس کی ملکیت لینے کے لیے ریپر۔ @ObservedObject کے برعکس، @StateObject ویو کی پوری زندگی کے دور میں شے کی ایک واحد مثال کی ضمانت دیتا ہے۔ یہاں تک کہ اگر SwiftUI ویو کا ڈھانچہ دوبارہ بنائے (جو اکثر ہوتا ہے)، @StateObject موجودہ شے کو محفوظ رکھتا ہے اور ابتدا کار کو دوبارہ نہیں بلاتا۔

swift
class UserSettings: ObservableObject {
    @Published var username: String = "Guest"
}

struct ProfileView: View {
    @StateObject var settings = UserSettings()

    var body: some View {
        ChildProfileView(settings: settings)
    }
}

struct ChildProfileView: View {
    @ObservedObject var settings: UserSettings

    var body: some View {
        Text("ہیلو، \(settings.username)")
    }
}

مثال میں، ProfileView @StateObject کے ذریعے UserSettings بناتا ہے، شے کا مالک بن جاتا ہے۔ ChildProfileView @ObservedObject کے ذریعے وہی مثال وصول کرتا ہے — مشاہدہ کرتا ہے لیکن زندگی کے دور کا انتظام نہیں کرتا۔ جب username بدلتا ہے، دونوں ویوز اپ ڈیٹ ہوتی ہیں۔ اگر ChildProfileView @ObservedObject کی بجائے @StateObject استعمال کرتا، تو ہر رینڈر پر ابتدائی قدر کے ساتھ ایک نئی مثال بنتی۔

اہم اصول: @StateObject اس ویو میں استعمال ہوتا ہے جو شے بناتا ہے (سچائی کا ماخذ)، جبکہ @ObservedObject اس ویو میں استعمال ہوتا ہے جو پیرنٹ سے پہلے سے بنی ہوئی شے وصول کرتا ہے۔ اس اصول کی خلاف ورزی حالت کے نقصان یا ڈیٹا کی غیر متوقع تخلیق نو کا باعث بنتی ہے۔

اپنا Property Wrapper بنانا

Swift کسی بھی بار بار پراپرٹی تک رسائی کی منطق کے لیے اپنی مرضی کے Property Wrappers بنانے کی اجازت دیتا ہے۔ بس @propertyWrapper وصف کے ساتھ struct یا class کا اعلان کریں اور wrappedValue کو نافذ کریں۔ نیچے UserDefaultsWrapper ریپر دکھایا گیا ہے، جو خود بخود UserDefaults کے ساتھ قدر کو ہم آہنگ کرتا ہے۔

swift
@propertyWrapper
struct UserDefaultsWrapper<T> {
    let key: String
    let defaultValue: T

    var wrappedValue: T {
        get { UserDefaults.standard.object(forKey: key) as? T ?? defaultValue }
        set { UserDefaults.standard.set(newValue, forKey: key) }
    }
}

struct AppConfig {
    @UserDefaultsWrapper(key: "theme", defaultValue: "light")
    var theme: String
}

UserDefaultsWrapper ریپر UserDefaults کے ذریعے تعاون یافتہ کسی بھی ڈیٹا کی قسم کے ساتھ کام کرنے کے لیے ایک عام T استعمال کرتا ہے۔ گیٹر کلید کے ذریعے قدر پڑھتا ہے، سیٹر لکھتا ہے۔ theme پراپرٹی پر @UserDefaultsWrapper(key:defaultValue:) لگانا اسے خود بخود اسٹوریج سے جوڑ دیتا ہے — تمام UserDefaults منطق ریپر کے اندر چھپی ہوئی ہے۔ یہ Property Wrappers کے ساتھ بوائلرپلیٹ کوڈ کم کرنے کی ایک عام مثال ہے۔

اپنی مرضی کے ریپر بناتے وقت، کارکردگی پر غور کرنا ضروری ہے۔ چونکہ گیٹر اور سیٹر ہر پراپرٹی تک رسائی پر بلائے جاتے ہیں، wrappedValue میں بھاری I/O آپریشن نہیں رکھنے چاہئیں۔ غیر متزامن ڈیٹا اسٹوریج کے لیے، Property Wrappers کو ObservableObject اور @Published کے ساتھ جوڑنا بہتر ہے۔

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

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

@State سادہ اقسام (String, Int, Bool) اور ڈھانچوں کے لیے ہے، جبکہ @StateObject ObservableObject کو نافذ کرنے والی حوالہ اقسام کے لیے ہے۔ @State قدر براہ راست SwiftUI میں ذخیرہ کرتا ہے، @StateObject ہیپ پر کلاس کی مثال کا انتظام کرتا ہے۔

کیا @State کے بغیر @Binding استعمال کیا جا سکتا ہے؟

ہاں، @Binding @StateObject، @ObservedObject یا $ پروجیکشن کا استعمال کرتے ہوئے کسی دوسرے Binding سے بنایا جا سکتا ہے۔ Binding کو ObservableObject سے $object.$publishedProperty کے ذریعے یا InlineBinding سے Binding.constant(value) کے ذریعے بھی ابتدا کیا جا سکتا ہے۔

پوری ایپلیکیشن میں استعمال ہونے والے ڈیٹا کے لیے کون سا Property Wrapper منتخب کریں؟

عالمی ڈیٹا کے لیے، @EnvironmentObject استعمال کریں یا EnvironmentValues کے ذریعے ObservableObject داخل کریں۔ @StateObject روٹ ویو کے لیے موزوں ہے جس کے بعد @ObservedObject کے ذریعے چائلڈ اجزاء تک منتقل کیا جاتا ہے۔

@ObservedObject ڈیٹا کو دوبارہ کیوں بنا سکتا ہے؟

@ObservedObject شے کا مالک نہیں ہے — اگر پیرنٹ ویو دوبارہ بنائی جائے اور ایک نیا مثال منتقل کرے، @ObservedObject اس پر سوئچ کر جائے گا۔ حالت کے نقصان سے بچنے کے لیے، مالک ویو کو @StateObject استعمال کرنا چاہیے۔

کیا غیر متزامن کارروائیوں کے لیے Property Wrapper بنایا جا سکتا ہے؟

ہاں، لیکن کلاس کے اندر @Published اور غیر متزامن افعال کے ساتھ ObservableObject کا مجموعہ استعمال کرنا آسان ہے۔ Property Wrapper فطرتاً ہم آہنگ ہے — wrappedValue ہر رسائی پر شمار کیا جاتا ہے، جو طویل کارروائیوں کے لیے موزوں نہیں ہے۔

خلاصہ

  • Property Wrapper — کوڈ کی نقل کے بغیر پراپرٹی تک رسائی کی منطق کو سمیٹنے کے لیے Swift 5.1 کا نحوی تعمیر
  • @State — سادہ اقسام کے لیے مقامی حالت، تبدیلی پر خود بخود ویو کو دوبارہ پینٹ کرتا ہے
  • @Binding — ملکیت کے بغیر پیرنٹ ویو ڈیٹا کا حوالہ، $ پروجیکشن کے ذریعے قابل رسائی
  • @StateObject — زندگی کے دور میں واحد مثال کی ضمانت کے ساتھ ObservableObject کی ملکیت
  • @ObservedObject — پیرنٹ جزو سے منتقل کردہ ObservableObject کا مشاہدہ
  • @Environment — SwiftUI نظام ماحول کی اشیاء تک رسائی
  • اپنی مرضی کے ریپر @propertyWrapper وصف اور wrappedValue کے نفاذ کے ذریعے بنائے جاتے ہیں

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

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

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

مزید پڑھیں