willSet اور didSet Swift میں پراپرٹی مبصر (property observers) ہیں جو پراپرٹی کی قدر تبدیل ہونے سے پہلے اور بعد میں کوڈ چلانے کی اجازت دیتے ہیں۔ computed properties کے برعکس، مبصرین نئی قدر کا حساب نہیں لگاتے بلکہ صرف تبدیلی پر ردعمل ظاہر کرتے ہیں۔ Apple کی دستاویزات، The Swift Programming Language (2026) کے مطابق، مبصرین ڈیٹا کی توثیق، انٹرفیس کی مطابقت پذیری اور کوڈ میں تبدیلیوں کی لاگنگ کے لیے ناگزیر ہیں۔
اہم نکات
willSet اور didSet Swift میں پراپرٹی مبصر (property observers) ہیں، جو stored properties میں تبدیلیوں کو ٹریک کرنے کا ایک بلٹ ان طریقہ کار ہے۔
دوسری زبانوں کے برعکس جہاں دستی setter نفاذ یا کال بیک سسٹم کی ضرورت ہوتی ہے، Swift تبدیلیوں پر ردعمل ظاہر کرنے کے لیے ایک اعلانیہ نحو فراہم کرتا ہے۔ مبصرین پراپرٹی کے اعلان کے فوراً بعد شامل کیے جاتے ہیں اور انہیں علیحدہ کال کرنے کی ضرورت نہیں ہوتی۔
Apple ڈویلپر دستاویزات (2026) کے مطابق، property observers کسی بھی کلاس، ساخت یا شمارندے کی stored properties کے لیے معاون ہیں۔ وہ computed properties کے ساتھ کام نہیں کرتے کیونکہ وہ قدر ذخیرہ نہیں کرتیں — ان کے لیے، تبدیلی پر ردعمل براہ راست setter میں لاگو کیا جاتا ہے۔
willSet پراپرٹی کو نئی قدر تفویض کرنے سے فوراً پہلے بلایا جاتا ہے۔ willSet کے اندر، غیر واضح پیرامیٹر newValue دستیاب ہوتا ہے جس میں وہ قدر ہوتی ہے جو سیٹ کی جائے گی۔ اس لمحے، پراپرٹی کی موجودہ قدر ابھی تک تبدیل نہیں ہوئی ہے — آپ پراپرٹی کے ذریعے براہ راست پرانی قدر پڑھ سکتے ہیں۔
Swift Evolution تجویز SE-0001 (2024) کے مطابق، willSet اصل تبدیلی سے پہلے توثیق یا لاگنگ کرنے کی صلاحیت فراہم کرتا ہے۔ اگر willSet میں کوئی استثناء پھینکا جاتا ہے تو نئی قدر لاگو نہیں ہوگی، جو مبصرین کو ڈیٹا کے تحفظ کا طریقہ کار بناتا ہے۔
didSet نئی قدر تفویض کرنے کے فوراً بعد بلایا جاتا ہے۔ didSet کے اندر، غیر واضح پیرامیٹر oldValue دستیاب ہوتا ہے جس میں تبدیلی سے پہلے کی قدر ہوتی ہے۔ اس مقام پر، پراپرٹی میں پہلے سے نئی قدر موجود ہوتی ہے اور آپ اس کا پرانی قدر سے موازنہ کر سکتے ہیں۔
Swift by Sundell (2025) کے مطابق، didSet سب سے مقبول مبصر ہے کیونکہ اس کی بعد از پروسیسنگ کے لیے اکثر ضرورت ہوتی ہے: یوزر انٹرفیس کو اپ ڈیٹ کرنا، منحصر فیلڈز کا دوبارہ حساب لگانا، یا تبدیلی کے بعد سرور کو ڈیٹا بھیجنا۔
Property observers پراپرٹی کے فوراً بعد گھنگریالے بریکٹ استعمال کرتے ہوئے اعلان کیے جاتے ہیں۔ کم از کم نحو کے لیے صرف ایک مبصر کی ضرورت ہوتی ہے، لیکن آپ دونوں کا اعلان کر سکتے ہیں۔
var score: Int = 0 {
willSet {
print("اسکور \(newValue) میں تبدیل ہو جائے گا")
}
didSet {
print("اسکور \(oldValue) سے \(score) میں تبدیل ہو گیا")
}
}
دونوں مبصر اختیاری ہیں — آپ صرف willSet یا صرف didSet بتا سکتے ہیں۔ willSet کے لیے آپ قوسین میں نام بتا کر newValue کا نام تبدیل کر سکتے ہیں۔
var username: String = "guest" {
willSet(newName) {
print("\(newName) سیٹ کرنے والا ہوں")
}
didSet(oldName) {
print("تھا \(oldName)، اب \(username)")
}
}
Swift Language Guide (2026) کے مطابق، پیرامیٹرز کا نام تبدیل کرنا کوڈ کی پڑھنے کی اہلیت کو بہتر بناتا ہے، خاص طور پر جب پراپرٹی اور مبصرین لمبے ناموں والے بڑے پروجیکٹ میں استعمال ہوتے ہیں۔
عملدرآمد کی ترتیب سختی سے متعین ہے: پہلے willSet (پرانی قدر دستیاب)، پھر تفویض، پھر didSet (نئی قدر دستیاب)۔
class Temperature {
var celsius: Double = 0.0 {
willSet {
print("درجہ حرارت \(celsius) سے \(newValue) میں تبدیل ہو جائے گا")
}
didSet {
if celsius > 100.0 {
print("ابلنے کا نقطہ تجاوز کر گیا!")
}
}
}
}
ایک اہم حد: مثال بناتے وقت پراپرٹی کی ابتدا کے دوران مبصرین نہیں بلائے جاتے۔ init کے اندر، قدر تفویض کرنا willSet اور didSet کو متحرک نہیں کرتا — یہ تعمیر کے مرحلے میں ناپسندیدہ ضمنی اثرات کو روکتا ہے۔
Apple Swift Blog (2025) کے مطابق، یہ رویہ بہت سی دوسری زبانوں سے مختلف ہے جہاں setter تعمیر کنندگان میں بھی بلائے جاتے ہیں۔ Swift حفاظت کا انتخاب کرتا ہے: مبصرین آبجیکٹ کی ابتدا مکمل ہونے کے بعد ہی کام کرنا شروع کرتے ہیں۔
didSet کے اندر پراپرٹی تبدیل کرنے سے بار بار مبصر کالز ہو سکتی ہیں۔ Swift تکرار کو مسدود نہیں کرتا — پروگرامر کو اسے دستی طور پر کنٹرول کرنا ہوگا۔
var counter: Int = 0 {
didSet {
if counter < 5 {
counter += 1
}
}
}
ایسا کوڈ اگر باہر نکلنے کی شرط فراہم نہ کی گئی تو اسٹیک اوور فلو کے ساتھ مکمل تکرار پیدا کرے گا۔ Stack Overflow Swift Community (2025) کے مطابق، property observers کے ساتھ کام کرتے وقت یہ ابتدائی افراد کی سب سے عام غلطیوں میں سے ایک ہے۔
ساختیں بغیر کسی پابندی کے stored properties کے لیے willSet اور didSet کو سپورٹ کرتی ہیں۔ یہ یاد رکھنا ضروری ہے کہ ساختیں قدر کی اقسام ہیں، اور mutating طریقہ کے اندر پراپرٹی میں ترمیم کرنا بھی مبصرین کو متحرک کرتا ہے۔
struct Point {
var x: Double = 0.0 {
didSet {
print("X \(x) میں تبدیل ہو گیا")
}
}
var y: Double = 0.0 {
didSet {
print("Y \(y) میں تبدیل ہو گیا")
}
}
}
var point = Point()
point.x = 5.0
پراپرٹی مبصرین Swift منصوبوں میں وسیع پیمانے پر کاموں کے لیے استعمال ہوتے ہیں: یوزر انٹرفیس کی مطابقت پذیری سے لے کر ڈیٹا کی توثیق اور لاگنگ تک۔
didSet آپ کو ایک غلط قدر کو سیٹ کرنے کے فوراً بعد واپس لانے یا درست کرنے کی اجازت دیتا ہے۔ یہ Objective-C میں بھاری setter کی جگہ لیتا ہے اور ماڈل کی سطح پر ڈیٹا کی سالمیت کو یقینی بناتا ہے۔
var age: Int = 0 {
didSet {
if age < 0 || age > 150 {
age = oldValue
}
}
}
جب کوئی متعلقہ پراپرٹی تبدیل ہوتی ہے، تو آپ علیحدہ اپ ڈیٹ طریقہ کال کے بغیر خود بخود انٹرفیس عناصر کو اپ ڈیٹ کر سکتے ہیں۔
var userName: String = "" {
didSet {
nameLabel.text = userName
}
}
willSet ڈیبگنگ یا آڈٹ کے مقاصد کے لیے لاگنگ کے لیے آسان ہے۔ آپ لاگو کرنے سے پہلے وقت اور نئی قدر ریکارڈ کر سکتے ہیں، اس بات کو یقینی بناتے ہوئے کہ لاگ میں تجزیہ کے لیے اصل ڈیٹا موجود ہے۔
objc.io (2025) کے مطابق، property observers خاص طور پر یک طرفہ ڈیٹا فلو والے فن تعمیرات میں مفید ہیں، جہاں بعد میں حالت کو دوبارہ پیدا کرنے کے لیے ہر پراپرٹی تبدیلی ریکارڈ کی جاتی ہے۔
Computed properties فوری طور پر قدر کا حساب لگاتی ہیں اور ان میں کوئی ذخیرہ نہیں ہوتا، جبکہ willSet اور didSet ایک حقیقی قدر کے ساتھ stored property پر کام کرتے ہیں۔
| خصوصیت | Property Observers | Computed Properties |
|---|---|---|
| قدر ذخیرہ کرتا ہے | ہاں | نہیں |
| تبدیلی پر کوڈ چلاتا ہے | ہاں | نہیں |
| اعلان کی قسم | var | var (get/set) |
| رسیس پیرامیٹرز | newValue, oldValue | newValue (set میں) |
| ابتدا | ابتدائی قدر درکار ہے | درکار نہیں |
بنیادی فرق: computed property ہر رسائی پر قدر کا حساب لگاتی ہے، جبکہ property observer موجودہ قدر کی تبدیلی پر ردعمل ظاہر کرتا ہے۔ ان کے درمیان انتخاب کا انحصار معنیات پر ہے — اگر پراپرٹی دوسرے ڈیٹا سے ماخوذ ہے تو computed استعمال کریں؛ اگر یہ ایک آزاد قدر ہے جس کی تبدیلیوں کی نگرانی کی ضرورت ہے تو willSet/didSet استعمال کریں۔
سب سے عام غلطی باہر نکلنے کی شرط کے بغیر didSet کا تکراری کال ہے۔ didSet کے اندر ہر پراپرٹی تبدیلی مبصر کو دوبارہ متحرک کرتی ہے، جس سے لامتناہی لوپ پیدا ہوتا ہے۔
دوسری عام غلطی let پراپرٹیز پر مبصرین استعمال کرنے کی کوشش ہے۔ Swift کمپائلر ایک خرابی دے گا کیونکہ let ایک مستقل ہے۔
تیسری غلطی اس بات کو نظر انداز کرنا ہے کہ ابتدا کے دوران مبصر نہیں بلایا جاتا۔ ڈویلپر جو init کے اندر willSet کے فعال ہونے کی توقع رکھتے ہیں انہیں غیر متوقع رویہ ملتا ہے۔
چوتھا مسئلہ extension میں پراپرٹیز پر مبصرین لگانا ہے۔ Swift extension میں stored properties پر willSet/didSet شامل کرنے سے منع کرتا ہے۔
Ray Wenderlich (2025) کے مطابق، ان حدود کو سمجھنا ابتدائی مراحل میں کیڑوں سے بچنے میں مدد کرتا ہے اور Swift کوڈ کو زیادہ پیش قیاسی بناتا ہے۔
اکثر پوچھے جانے والے سوالات
ہاں، ہر مبصر اختیاری ہے۔ آپ صرف willSet، صرف didSet، یا دونوں ایک ساتھ اعلان کر سکتے ہیں۔
نہیں، Swift extension میں stored properties کے لیے willSet اور didSet شامل کرنے سے منع کرتا ہے۔ مبصرین صرف اصل قسم کی تعریف میں اعلان کیے جاتے ہیں۔
نہیں، ابتدا کے دوران مبصرین نہیں بلائے جاتے۔ یہ ایک حفاظتی طریقہ کار ہے جو آبجیکٹ کی تعمیر کے مرحلے میں ضمنی اثرات کو روکتا ہے۔
willSet ایک stored property مبصر ہے جو قدر تبدیل ہونے سے پہلے عمل میں آتا ہے۔ computed property میں setter ایک نئی قدر کا حساب لگانے کا طریقہ ہے، نہ کہ موجودہ قدر کا مشاہدہ کرنے کا۔
بار بار didSet کال کرنے سے تکرار پیدا ہوگی۔ باہر نکلنے کی شرط کے بغیر، یہ اسٹیک اوور فلو اور پروگرام کے خاتمے کا باعث بنتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں