Associated Values — ایک Swift میکانزم جو ہر enum کیس میں انفرادی طور پر صوابدیدی ڈیٹا منسلک کرنے کی اجازت دیتا ہے۔ raw values کے برعکس، جہاں تمام کیسز کی ایک ہی قسم کی قدریں ہوتی ہیں، associated values ہر کیس کے لیے قسم اور مقدار میں مختلف ہو سکتی ہیں۔ Apple Documentation, 2026 کے مطابق، اضافی ریپر اقسام بنائے بغیر ڈومین کو درست طریقے سے ماڈل کرنے کے لیے یہ ایک اہم صلاحیت ہے۔
اہم نکات
Associated Values اضافی معلومات ہیں جو ایک enum کیس اپنے ساتھ ذخیرہ کر سکتا ہے۔ raw values کے برعکس، جو اعلان کی سطح پر مقرر ہوتی ہیں، associated values enum مثال بناتے وقت سیٹ کی جاتی ہیں۔
ایک ادائیگی کا طریقہ ماڈل کرنے کا تصور کریں: creditCard کیس آخری 4 ہندسے اور میعاد ختم ہونے کی تاریخ ذخیرہ کر سکتا ہے، جبکہ applePay کیس کچھ بھی ذخیرہ نہیں کرتا۔ associated values کے ساتھ، یہ ذیلی طبقات یا اختیاری فیلڈز کے بغیر قدرتی طور پر لاگو ہوتا ہے۔
Apple دستاویزات کے مطابق، associated values enum کو سادہ مستقلات کے ایک مجموعے سے ایک الجبری ڈیٹا ٹائپ (sum type) میں تبدیل کر دیتی ہیں، جو فعال زبانوں کی خصوصیت ہے۔ یہ کوڈ کے اظہار کو نمایاں طور پر بڑھاتا ہے۔
Associated Values کو کیس کے بعد قوسین میں اعلان کیا جاتا ہے، جس میں پیرامیٹر کے نام اور اقسام بتائے جاتے ہیں، جیسے فنکشنز میں۔
enum MediaFile {
case image(width: Int, height: Int, format: String)
case video(duration: Double, codec: String)
case audio(bitrate: Int)
case unknown
}
مثال بناتے وقت، associated values کو دلائل کے طور پر منتقل کیا جاتا ہے:
let photo = MediaFile.image(width: 1920, height: 1080, format: "jpeg")
let clip = MediaFile.video(duration: 120.5, codec: "h264")
Swift associated values کی تعداد یا اقسام پر پابندیاں عائد نہیں کرتا۔ آپ associated values کے اندر generics، closure فنکشنز اور دیگر enum استعمال کر سکتے ہیں۔ یہ پیچیدہ نیسٹڈ ڈھانچے بنانا ممکن بناتا ہے۔
associated values کے پیرامیٹر کے نام مثال بناتے وقت دلیل لیبل کے طور پر استعمال ہوتے ہیں — یہ کوڈ پڑھنے کی صلاحیت کو بہتر بناتا ہے۔ switch کے ذریعے اخراج کے وقت، نام دستاویزات کے طور پر کام کرتے ہیں، ہر قدر کے معنی واضح کرتے ہیں۔ یہ نقطہ نظر کوڈ کو خود دستاویز کرنے والا بناتا ہے اور ڈیٹا مماثلت کے وقت غلطیوں کے امکان کو کم کرتا ہے۔ یہ بڑی iOS ایپلیکیشنز کی ٹیم ڈویلپمنٹ میں خاص طور پر قیمتی ہے۔
Switch associated values نکالنے کا بنیادی طریقہ ہے۔ اقدار let یا var کے ذریعے مستقلات یا متغیرات سے منسلک ہوتی ہیں۔
func describe(_ file: MediaFile) -> String {
switch file {
case .image(let w, let h, let fmt):
return "Image \(w)x\(h) .\(fmt)"
case .video(let duration, let codec):
return "Video \(duration)s, \(codec)"
case .audio(let bitrate):
return "Audio \(bitrate)kbps"
case .unknown:
return "Unknown format"
}
}
Swift جزوی مماثلت کو سپورٹ کرتا ہے — آپ associated values کے لیے مخصوص اقدار بتا سکتے ہیں:
switch file {
case .image(let w, let h, "png"):
print("PNG تصویر \(w)x\(h)")
case .image(1920, 1080, _):
print("Full HD تصویر")
default:
break
}
وائلڈ کارڈ (_) کا استعمال غیر ضروری associated values کو نظرانداز کرنے کی اجازت دیتا ہے، اور کیسز میں موجود مستقلات آپ کو مخصوص اقدار سے مماثلت چیک کرنے دیتے ہیں۔
بہت سے ابتدائی ڈویلپر associated values کو raw values کے ساتھ الجھاتے ہیں۔ یہ مختلف استعمال کے معاملات کے ساتھ مختلف میکانزم ہیں۔
| خصوصیت | Raw Values | Associated Values |
|---|---|---|
| ڈیٹا کی قسم | تمام کیسز کے لیے ایک قسم | ہر کیس کے لیے مختلف اقسام |
| تفویض کا وقت | enum اعلان پر | مثال بنانے پر |
| لازمی | تمام کیسز کی ایک قدر ہوتی ہے | کچھ کیسز بغیر اقدار کے ہو سکتے ہیں |
| مطابقت | باہمی طور پر خارج — ایک ساتھ استعمال نہیں کیا جا سکتا | |
Swift Evolution کے مطابق، associated values کو Swift 2.0 میں enum کے دوبارہ ڈیزائن کے حصے کے طور پر متعارف کرایا گیا تھا۔ وہ اقسام کے لیے الجبری نقطہ نظر فراہم کرتی ہیں، جہاں ہر کیس اپنے دستخط کے ساتھ ایک علیحدہ کنسٹرکٹر ہے۔
Associated Values حقیقی iOS منصوبوں میں فعال طور پر استعمال ہوتی ہیں۔ آئیے تین عام منظرناموں پر غور کریں۔
enum APIResponse<T: Codable> {
case success(data: T, cached: Bool)
case failure(error: Error, retryAvailable: Bool)
case loading(progress: Double)
}
enum ViewState<T> {
case idle
case loading(message: String)
case loaded(data: T)
case error(message: String, retryAction: () -> Void)
}
associated values کے ساتھ، enum اسٹیٹ مشینوں کے لیے ایک طاقتور ٹول بن جاتا ہے: ہر کیس ایک حالت ہے، associated values اس حالت کے پیرامیٹرز ہیں۔ کمپائلر اس بات کی ضمانت دیتا ہے کہ تمام ٹرانزیشنز کو ہینڈل کیا گیا ہے۔
switch کے بغیر کسی ایک کیس کو چیک کرنے کے لیے، if case یا guard case استعمال کریں۔ جب آپ کو صرف ایک آپشن ہینڈل کرنے کی ضرورت ہو تو یہ زیادہ کمپیکٹ ہے۔
let error = NetworkError.timeout(seconds: 30)
if case .timeout(let seconds) = error {
print("درخواست \(seconds)s کے بعد ختم ہو گئی")
}
guard case .httpError(let code, _) = error else {
return
}
print("\(code) کوڈ کے ساتھ HTTP خرابی")
اکثر پوچھے گئے سوالات
جی ہاں، ایک کیس میں associated values نہیں ہو سکتی — مثال کے طور پر، case unknown۔ اس طرح کے کیسز اضافی ڈیٹا کے بغیر عام enum کیسز کی طرح برتاؤ کرتے ہیں۔ یہ مارکر حالتوں کے لیے آسان ہے۔
Swift associated values والے enum کے لیے خود کار طریقے سے Equatable پیدا نہیں کرتا (Swift 4.2+ سے پہلے)۔ واضح Equatable نفاذ شامل کریں یا ہر کیس کا ترتیب وار موازنہ کرنے کے لیے switch استعمال کریں۔
جی ہاں، indirect enum میں associated values درخت اور منسلک فہرستیں بنانے کی ایک معیاری تکنیک ہے۔ ایک کیس میں indirect سے نشان زد ایک ہی قسم کی associated value ہو سکتی ہے۔
Associated Values ٹائپ محفوظ ہیں — ہر کیس کی ضمانت ہے کہ اس کا صرف اپنا ڈیٹا ہے۔ اختیاری خصوصیات والے struct میں، ہر مثال میں تمام فیلڈز ہوتے ہیں اور رن ٹائم nil جانچ کی ضرورت ہوتی ہے۔
Swift associated values والے enum کے لیے خود کار طریقے سے Codable پیدا نہیں کرتا۔ حسب ضرورت کوڈنگ کیز استعمال کرتے ہوئے کیسز پر switch کے ذریعے encode اور decode کا دستی نفاذ ضروری ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں