@Published Combine فریم ورک کا ایک property wrapper ہے جو ObservableObject پروٹوکول کی تعمیل کرنے والے کلاس کی خصوصیت میں تبدیلیوں کو خود بخود شائع کرتا ہے۔ جب @Published سے نشان زدہ خصوصیت کی قدر تبدیل ہوتی ہے، SwiftUI objectWillChange کے ذریعے سگنل وصول کرتا ہے اور اس آبجیکٹ کو سبسکرائب کرنے والے تمام مناظر کو دوبارہ ڈرا کرتا ہے۔ Apple Combine Framework دستاویزات (2025) کے مطابق، @Published ایک Publisher تیار کرتا ہے جسے Combine آپریٹرز: map، filter، debounce اور دیگر کے ذریعے مزید تبدیل کیا جا سکتا ہے۔ یہ @Published کو MVVM فن تعمیر میں ڈیٹا اور صارف انٹرفیس کے درمیان ایک اہم پل بناتا ہے۔
اہم نکات
objectWillChange کال ہوتا ہے، جو سبسکرائب کردہ مناظر کی دوبارہ ڈرائنگ کو متحرک کرتا ہے$property کے ذریعے قابل رسائی — سٹریم کو سبسکرائب، یکجا اور تبدیل کیا جا سکتا ہے@Published Combine ماڈیول میں متعین کردہ ایک property wrapper ہے جو کلاس کی خصوصیت میں تبدیلیوں کے بارے میں سبسکرائبرز کو خود بخود مطلع کرنے کی صلاحیت شامل کرتا ہے۔ یہ صرف ایک کلاس کے اندر (ساخن میں نہیں) اور صرف ObservableObject پروٹوکول کی تعمیل کرنے والے کلاس کی خصوصیات پر استعمال کیا جا سکتا ہے۔
جب @Published خصوصیت کی قدر تبدیل ہوتی ہے، Combine ڈالر کے سابقہ کے ذریعے قابل رسائی بلٹ ان publisher کے ذریعے ایک واقعہ تیار کرتا ہے: $propertyName۔ یہ publisher ایک ObservableObjectPublisher ہے، جو خود ObservableObject سے تعلق رکھتا ہے۔ SwiftUI خود بخود اسے سبسکرائب کرتا ہے جب کوئی منظر @ObservedObject یا @StateObject استعمال کرتا ہے، اور جب بھی آبجیکٹ کے اندر کوئی @Published خصوصیت تبدیل ہوتی ہے تو منظر کو دوبارہ ڈرا کرتا ہے۔
Matt Neuburg کی کتاب “IOS 18 Programming Fundamentals with Swift” (2025) کے مطابق، @Published willSet پیٹرن پر ایک آسان ریپر ہے، جو خود بخود objectWillChange.send() کال کرتا ہے۔ درحقیقت، مرتب کرنے والا @Published کو willSet آبزرور کے ساتھ ایک حسابی خصوصیت میں پھیلا دیتا ہے، جو دستی نفاذ کے مقابلے میں رن ٹائم پر صفر اوور ہیڈ فراہم کرتا ہے۔
ان تمام ObservableObject خصوصیات کے لیے @Published استعمال کریں جن کی تبدیلیاں انٹرفیس میں ظاہر ہونی چاہئیں۔ ان خصوصیات کے لیے جو UI کو متاثر نہیں کرتیں، @Published کے بغیر عام ذخیرہ شدہ خصوصیات غیر ضروری دوبارہ ڈرائنگ کو کم کرتی ہیں۔
@Published مرتب کرنے کے وقت دو اہم عناصر پیدا کرتا ہے۔ پہلا willSet آبزرور کے ساتھ ایک ذخیرہ شدہ خصوصیت ہے جو نئی قدر لکھنے سے پہلے objectWillChange.send() کال کرتی ہے۔ دوسرا پروجیکشن $propertyName ہے، جو ایک Published.Publisher لوٹاتا ہے جسے براہ راست Combine پائپ لائنوں میں استعمال کیا جا سکتا ہے۔
تین خصوصیات والے Settings کلاس پر غور کریں: دو @Published اور ایک عام:
class Settings: ObservableObject {
@Published var username: String = "Guest"
@Published var isDarkMode = false
var lastLogin: Date = Date() // without @Published
}
جب username یا isDarkMode تبدیل ہوتا ہے، SwiftUI Settings مثال کو سبسکرائب کرنے والے تمام مناظر کو دوبارہ ڈرا کرے گا۔ lastLogin کو تبدیل کرنے سے دوبارہ ڈرائنگ متحرک نہیں ہوگی۔ اگر آپ کو کسی عام خصوصیت میں تبدیلی کے بارے میں سبسکرائبرز کو دستی طور پر مطلع کرنے کی ضرورت ہے، تو آپ willSet آبزرور میں objectWillChange.send() کال کر سکتے ہیں۔
ایک اہم تفصیل: @Published صرف اس وقت تبدیلیاں شائع کرتا ہے جب کسی خصوصیت کو براہ راست تفویض کیا جاتا ہے۔ اگر خصوصیت حوالہ قسم (کلاس) ہے اور حوالہ تبدیل کیے بغیر اس کی اندرونی حالت تبدیل ہوتی ہے، تو @Published اس کا پتہ نہیں لگائے گا۔ ایسی صورتوں میں، دستی واقعہ بھیجنا یا قدر کی قسم (ساخن) پر سوئچ کرنا ضروری ہے۔
@Published Combine کے ساتھ مضبوطی سے مربوط ہے — ہر @Published خصوصیت خود بخود ایک publisher فراہم کرتی ہے جو پروجیکشن $propertyName کے ذریعے قابل رسائی ہے۔ یہ فلٹرنگ، تبدیلی، یکجا کرنے اور تاخیر سے قدر پروسیسنگ کے لیے Combine آپریٹرز کے استعمال کی اجازت دیتا ہے۔
ایک عام منظر نامہ ڈیباؤنس کے ساتھ تلاش ہے۔ ایک ان پٹ فیلڈ @Published خصوصیت searchText سے منسلک ہے، لیکن سرور کی درخواست صرف 300 ms کے وقفے کے بعد بھیجی جانی چاہیے۔ $searchText.debounce کے ساتھ Combine اسے ایک سطر میں حل کرتا ہے:
class SearchViewModel: ObservableObject {
@Published var searchText = ""
@Published var results: [String] = []
private var cancellables = Set<AnyCancellable>()
init() {
setupSearchSubscription()
}
private func setupSearchSubscription() {
$searchText
.debounce(for: .milliseconds(300), scheduler: RunLoop.main)
.removeDuplicates()
.sink { [weak self] text in
self?.performSearch(text)
}
.store(in: &cancellables)
}
private func performSearch(_ text: String) { }
}
John Sundell کے مضمون (Swift by Sundell, 2024) کے مطابق، @Published کو Combine کے ساتھ جوڑنا SwiftUI ایپلیکیشنز میں رد عمل پائپ لائنوں کے لیے ایک معیاری پیٹرن ہے: توثیق، debounce، throttle، combineLatest، دوسرے publishers کے ساتھ merge۔ @Published امرتی UI کوڈ اور رد عمل Combine کے درمیان ایک پل کا کام کرتا ہے۔
iOS 17 کی ریلیز کے ساتھ، Apple نے @Observable میکرو متعارف کرایا، جو ObservableObject اور @Published کے بغیر رد عمل کے لیے ایک متبادل طریقہ پیش کرتا ہے۔ @Observable لکھنے کی سطح کے بجائے پڑھنے کی سطح پر خصوصیات تک رسائی کو خود بخود ٹریک کرتا ہے، جو زیادہ درست دوبارہ ڈرائنگ فراہم کرتا ہے — صرف وہ منظر اپ ڈیٹ ہوتا ہے جو کسی مخصوص تبدیل شدہ خصوصیت کو پڑھتا ہے۔
تاہم، اس کا مطلب یہ نہیں ہے کہ @Published متروک ہے۔ @Published ضروری رہتا ہے جب Combine پائپ لائن انضمام کی ضرورت ہو — پروجیکشن $propertyName ایک publisher فراہم کرتا ہے جو @Observable کے پاس نہیں ہے۔ مزید برآں، iOS 16 اور اس سے نیچے کے ساتھ پسماندہ مطابقت کے لیے، @Published+ObservableObject واحد آپشن ہے۔ Apple WWDC 2023 سیشن “Discover Observation in SwiftUI” کے مطابق، Apple نئے منصوبوں کے لیے @Observable کی سفارش کرتا ہے، لیکن موجودہ کوڈ اور Combine منظرناموں کے لیے @Published کی حمایت کو واضح طور پر برقرار رکھتا ہے۔
عملی طور پر، بہت سے منصوبے ایک ہائبرڈ طریقہ استعمال کرتے ہیں: نئے ڈیٹا ماڈل @Observable استعمال کرتے ہیں، جبکہ @Published کے ساتھ موجودہ ObservableObject بغیر ری فیکٹرنگ کے رہتے ہیں۔ @Published اس وقت بھی ناگزیر ہے جب اشاعت پر باریک کنٹرول کی ضرورت ہو — مثال کے طور پر، متعدد خصوصیات کی بیچ اپ ڈیٹ مکمل ہونے تک اطلاع میں تاخیر کرنا۔
پہلی غلطی ساخن میں @Published استعمال کرنا ہے۔ مرتب کرنے والا ایک خرابی دے گا: “Property wrapper cannot be applied to a computed property” یا “‘@Published’ is only available on members of a class.” @Published کو حوالہ معنویات کی ضرورت ہے کیونکہ ObservableObjectPublisher ایک کلاس ہے جو ہر مثال کے لیے منفرد ہونی چاہیے۔
دوسری غلطی حوالہ تبدیل کیے بغیر حوالہ خصوصیت کے مواد کو تبدیل کرنا ہے۔ اگر @Published خصوصیت صف کی قسم [String] ہے اور آپ array.append("نیا") کال کرتے ہیں، @Published تبدیلی کا پتہ نہیں لگائے گا کیونکہ صف کا حوالہ تبدیل نہیں ہوا ہے۔ حل: خصوصیت کو ایک نئی قدر تفویض کریں array = array + ["نیا"] یا دستی طور پر objectWillChange.send() استعمال کریں۔
تیسری غلطی @Published خصوصیات کی ضرورت سے زیادہ تعداد ہے۔ ہر @Published خصوصیت ObservableObject کو سبسکرائب کرنے والے تمام مناظر کی دوبارہ ڈرائنگ کو متحرک کرتی ہے، نہ کہ صرف وہ جو اس خصوصیت کو پڑھتے ہیں۔ Point-Free (2025) کے مطابق، ایک بڑے ObservableObject کو @StateObject اور @EnvironmentObject کے ساتھ کئی چھوٹے ObservableObject میں تقسیم کرنے سے غیر ضروری دوبارہ ڈرائنگ کم ہوتی ہے اور کارکردگی بہتر ہوتی ہے۔
پہلی مثال توثیق کے ساتھ رجسٹریشن فارم کا ViewModel ہے۔ @Published خصوصیات email اور password Combine پائپ لائن کے ذریعے توثیق کی خرابی کے ڈسپلے کو متحرک کرتی ہیں:
class RegistrationViewModel: ObservableObject {
@Published var email = ""
@Published var password = ""
@Published var emailError: String?
@Published var isFormValid = false
private var cancellables = Set<AnyCancellable>()
init() {
$email
.map { $0.contains("@") ? nil : "Invalid email" }
.assign(to: &$emailError)
.store(in: &cancellables)
$email.combineLatest($password)
.map { !$0.isEmpty && !$1.isEmpty }
.assign(to: &$isFormValid)
.store(in: &cancellables)
}
}
دوسری مثال حوالہ عناصر کے مجموعے کے لیے دستی اشاعت ہے۔ عنصر کے اندر ہر تبدیلی پر پوری صف کو تبدیل کرنے کے بجائے، objectWillChange.send() استعمال کیا جاتا ہے:
class TodoItem {
var title: String
var isDone = false
init(title: String) { self.title = title }
}
class TodoListViewModel: ObservableObject {
@Published var items: [TodoItem] = []
func toggle(item: TodoItem) {
item.isDone.toggle()
self.objectWillChange.send() // manual notification
}
}
تیسری مثال Combine کے ذریعے @Published خصوصیت کو Assign کرنا ہے۔ Swift 5.9 کے نئے نحو کا استعمال کرتے ہوئے، آپ Optional ریپر کے بغیر پروجیکشن assign(to: &$property) کے ذریعے براہ راست تفویض کر سکتے ہیں۔ سبسکرپشن بنائے بغیر publisher کو @Published خصوصیت سے جوڑنے کا یہ سب سے چھوٹا طریقہ ہے۔
اکثر پوچھے گئے سوالات
نہیں، @Published صرف ObservableObject کی تعمیل کرنے والے کلاس کے اندر استعمال کیا جا سکتا ہے۔ ساخنوں میں، مقامی حالت کے لیے @State یا iOS 17+ میں @Observable میکرو کے ساتھ @Bindable استعمال کریں۔ ساخن میں @Published استعمال کرنے کی کوشش مرتب کرنے کی خرابی کا سبب بنے گی۔
صحیح طریقہ: نئی قدر مکمل طور پر تفویض کریں (array = array + ["نیا"])۔ @Published حوالہ کی تبدیلی کو ٹریک کرتا ہے، مواد کی تبدیلی کو نہیں۔ حوالہ اقسام کے مجموعوں کے لیے، عناصر کی اندرونی حالت تبدیل کرنے کے بعد دستی objectWillChange.send() استعمال کریں۔
@State ایک منظر کے اندر مقامی حالت کے لیے ڈیزائن کیا گیا ہے اور صرف قدر کی اقسام کے ساتھ کام کرتا ہے۔ @Published ObservableObject خصوصیات کے لیے ہے جو @ObservedObject یا @EnvironmentObject کے ذریعے متعدد مناظر پڑھ سکتے ہیں۔ @State آسان ہے، @Published Combine انضمام کی وجہ سے زیادہ طاقتور ہے۔
صرف ان کو جن کی تبدیلیوں کو UI کو اپ ڈیٹ کرنا چاہیے۔ اندرونی حسابات، کیشے یا عارضی جھنڈوں کے لیے خصوصیات کو @Published کی ضرورت نہیں ہے — اس سے غیر ضروری دوبارہ ڈرائنگ کم ہوتی ہے۔ @Published کو اس اشارے کے طور پر استعمال کریں کہ “یہ خصوصیت انٹرفیس کے لیے اہم ہے۔”
SwiftUI، NSManagedObject کے لیے @FetchRequest اور @ObservedObject کے ذریعے Core Data کے ساتھ مربوط ہوتا ہے۔ ManagedObject پہلے ہی ObservableObject کی تعمیل کرتا ہے، لہذا @Published کی ضرورت نہیں ہے — NSManagedObject خود تبدیلیوں کی اطلاع دیتا ہے۔ @Published ڈیٹا کی تبدیلی کے لیے Core Data اور UI کے درمیان ViewModel پرت میں استعمال ہوتا ہے۔
خلاصہ
objectWillChange.send() کال کرتا ہے، پروجیکشن $property کے ذریعے publisher تیار کرتا ہےassign(to: &$property) publisher کو براہ راست @Published خصوصیت میں سبسکرائب کرنے کی اجازت دیتا ہےہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں