Swift میں Protocol Extension: یہ کیا ہے اور اسے کیسے استعمال کریں

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

Protocol Extension ایک Swift میکانزم ہے جو کسی پروٹوکول کے لیے طریقوں اور خصوصیات کے ڈیفالٹ نفاذ فراہم کرنے کی اجازت دیتا ہے۔ where پابندیوں کے ساتھ مل کر، protocol extension صرف ان اقسام میں رویہ شامل کرنا ممکن بناتا ہے جو مخصوص شرائط کو پورا کرتی ہیں۔ Apple Documentation, 2026 کے مطابق، یہ پروٹوکول پر مبنی پروگرامنگ کا ایک اہم عنصر ہے، جو کلاس کے درجہ بندی کے بغیر کوڈ کے دوبارہ استعمال کو قابل بناتا ہے۔

اہم نکات

  • Protocol Extension — پروٹوکول کے لیے ڈیفالٹ طریقہ کار کا نفاذ
  • Default implementation اقسام کے درمیان کوڈ کی نقل سے بچاتا ہے
  • Where clauses توسیع کو صرف مخصوص اقسام تک محدود کرتی ہیں
  • اوور رائڈ — ایک قسم ڈیفالٹ کے بجائے اپنا نفاذ فراہم کر سکتی ہے
  • POP — protocol extensions OOP کی بنیادی کلاسوں کو بدل دیتے ہیں

Protocol Extension کیا ہے؟

Protocol Extension موجودہ پروٹوکول میں طریقوں اور حسابی خصوصیات کے نفاذ کو شامل کرنے کا ایک طریقہ ہے۔ توسیعات کے بغیر، پروٹوکول صرف تقاضوں کی وضاحت کرتا ہے، اور ہر قسم انہیں انفرادی طور پر نافذ کرتی ہے۔

Protocol Extension کوڈ کی نقل کے مسئلے کو حل کرتا ہے: اگر پانچ structs ایک ہی پروٹوکول کو اپناتی ہیں اور ایک ہی طریقہ نافذ کرتی ہیں، تو توسیع ایک بار ڈیفالٹ نفاذ فراہم کرتی ہے۔

Swift Evolution proposal SE-0186 کے مطابق، protocol extensions ان اہم خصوصیات میں سے ہیں جنہوں نے POP کی کامیابی کو پیش کیا۔ وہ بنیادی کلاسیں بنائے بغیر اور واحد ذمہ داری کے اصول کی خلاف ورزی کیے بغیر مشترکہ رویہ شامل کرنے کی اجازت دیتے ہیں۔

Protocol extension کا نحو

Protocol Extension ایک عام توسیع کی طرح اعلان کیا جاتا ہے لیکن ایک قسم کے بجائے پروٹوکول کے نام کے ساتھ۔

swift
protocol Greetable {
    var name: String { get }
    func greet() -> String
}

extension Greetable {
    func greet() -> String {
        return "Hello, \(name)!"
    }
}

اب کوئی بھی قسم جو Greetable کو اپناتی ہے خود بخود greet کا نفاذ حاصل کرتی ہے:

swift
struct Person: Greetable {
    let name: String
}
// Person خود بخود greet() رکھتا ہے

let user = Person(name: "Alice")
print(user.greet()) // "ہیلو، Alice!"

Protocol Extension میں حسابی خصوصیات شامل ہو سکتی ہیں لیکن ذخیرہ شدہ خصوصیات نہیں (پروٹوکول اسٹوریج کی وضاحت نہیں کر سکتے)۔ آپ توسیعات کے ذریعے subscript اور نیسٹڈ اقسام بھی شامل کر سکتے ہیں۔

ڈیفالٹ طریقہ کار کے نفاذ

ڈیفالٹ نفاذ protocol extension کا بنیادی استعمال ہے۔ ایک قسم اپنا ورژن فراہم کر کے طریقہ کو اوور رائڈ کر سکتی ہے۔

swift
protocol Loggable {
    func log(message: String)
}

extension Loggable {
    func log(message: String) {
        print("[Default] \(message)")
    }
}

struct ConsoleLogger: Loggable {}
// ڈیفالٹ نفاذ استعمال کرتا ہے

struct FileLogger: Loggable {
    func log(message: String) {
        // کسٹم نفاذ ڈیفالٹ کو اوور رائڈ کرتا ہے
        writeToFile(message)
    }
}

کلاس وراثت سے ایک اہم فرق: اگر قسم خود پروٹوکول کے طریقہ کو نافذ کرتی ہے، تو اس کا نفاذ کال کیا جاتا ہے۔ اگر نہیں، تو توسیع سے ڈیفالٹ استعمال ہوتا ہے۔ یہ جامد تقسیم ہے — فیصلہ مرتب وقت پر کیا جاتا ہے۔

Protocol extension میں where پابندیاں

Where شق protocol extension کو صرف ان اقسام تک محدود کرنے کی اجازت دیتی ہے جو اضافی شرائط کو پورا کرتی ہیں۔ یہ خصوصی رویہ شامل کرنے کے لیے ایک طاقتور میکانزم ہے۔

swift
protocol Printable {
    var content: String { get }
}

extension Printable where Self: CustomStringConvertible {
    func debugPrint() -> String {
        return "[Printable] \(content)"
    }
}

یہاں debugPrint صرف ان اقسام کے لیے دستیاب ہے جو بیک وقت Printable اور CustomStringConvertible کو نافذ کرتی ہیں۔ Swift معیاری لائبریری اس نمونے کو بڑے پیمانے پر استعمال کرتی ہے — مثال کے طور پر، Collection کے لیے توسیعات where Element۔

قسم کی برابری کی پابندیوں والی where شقیں خاص طور پر مفید ہیں:

swift
extension Collection where Element == String {
    func commaJoined() -> String {
        return self.joined(separator: ", ")
    }
}

let words = ["Swift", "Kotlin", "Java"]
print(words.commaJoined()) // "Swift, Kotlin, Java"

یہ میکانزم protocol extension کو انتخابی بناتا ہے: commaJoined طریقہ صرف سٹرنگ کلیکشنز کے لیے دستیاب ہے، عددی کلیکشنز کے لیے نہیں۔ مرتب پابندیوں کو جامد طور پر چیک کرتا ہے۔

Where پابندیاں چیک کر سکتی ہیں:

  • پروٹوکول کی تعمیل: where Self: Equatable
  • قسم کی پابندی: where Element == String
  • مجموعے: where Element: Numeric, Element: Comparable

یہ protocol extension کو عام پروٹوکول کے نفاذ کو آلودہ کیے بغیر خصوصی رویہ شامل کرنے کے لیے ایک طاقتور میکانزم بناتا ہے۔

Protocol Extensions بمقابلہ وراثت

بہت سے ڈویلپر سوچتے ہیں: protocol extensions کب استعمال کریں اور کلاس وراثت کب؟ جواب فن تعمیر کے نمونے پر منحصر ہے۔

خصوصیتProtocol Extensionکلاس وراثت
قدر کی اقسامstruct اور enum کے ساتھ کام کرتا ہےصرف کلاسیں
متعدد اپناناایک قسم کئی پروٹوکول اپنا سکتی ہےایک سپرکلاس
حالتکوئی ذخیرہ شدہ خصوصیات نہیںذخیرہ شدہ خصوصیات ہو سکتی ہیں
تقسیمجامد تقسیم (ڈیفالٹ)متحرک تقسیم (ورچوئل ٹیبلز)

Apple protocol + extension سے شروع کرنے اور صرف مشترکہ حالت یا شناخت (حوالہ سیمنٹکس) کی ضرورت ہونے پر کلاسوں پر سوئچ کرنے کی سفارش کرتا ہے۔ Protocol Extensions وراثت کے بجائے کمپوزیشن فراہم کرتے ہیں — ایک زیادہ لچکدار اور قابل آزمائش طریقہ۔

عملی طور پر، protocol extensions اکثر پروٹوکول کی ضروریات کے اوپر آسان ریپر طریقے شامل کرنے کے لیے استعمال ہوتے ہیں۔ مثال کے طور پر، اگر کوئی پروٹوکول تفصیلی رپورٹ کے ساتھ validate طریقہ کا تقاضا کرتا ہے، تو توسیع isValid طریقہ شامل کر سکتی ہے جو مکمل ورژن کی بنیاد پر بولین ویلیو لوٹاتا ہے۔ یہ پروٹوکول معاہدے کو تبدیل کیے بغیر کلائنٹ کوڈ کو آسان بناتا ہے۔ اس نمونے کو “ماخوذ API کے ساتھ ڈیفالٹ نفاذ” کہا جاتا ہے اور Swift معیاری لائبریری اور مشہور تیسری پارٹی فریم ورکس میں بڑے پیمانے پر استعمال ہوتا ہے۔ یہ عمل میں پروٹوکول پر مبنی پروگرامنگ کی کلیدی تکنیکوں میں سے ایک ہے اور لچکدار فن تعمیر کی بنیاد ہے۔

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

کیا Protocol Extension میں ذخیرہ شدہ خصوصیت ہو سکتی ہے؟

نہیں، protocol extension میں صرف حسابی خصوصیات ہو سکتی ہیں۔ ذخیرہ شدہ خصوصیات ممنوع ہیں کیونکہ پروٹوکول میموری کا مالک نہیں ہے — ٹھوس قسم (struct, class, enum) ڈیٹا ذخیرہ کرنے کی ذمہ دار ہے۔

اوور رائڈ کرتے وقت protocol extension نفاذ کیسے منتخب کرتا ہے؟

جامد تقسیم استعمال کی جاتی ہے: اگر قسم واضح طور پر طریقہ کو نافذ کرتی ہے، تو اس کا ورژن کال کیا جاتا ہے۔ اگر نہیں، تو توسیع سے ڈیفالٹ استعمال ہوتا ہے۔ existential (any) کے ذریعے رسائی کرتے وقت، متحرک تقسیم کا اطلاق ہوتا ہے۔

کیا Protocol Extension میں convenience init شامل کیا جا سکتا ہے؟

ہاں، protocol extension میں ابتدا کار شامل ہو سکتے ہیں۔ تاہم، پروٹوکول توسیع کے ذریعے init کا تقاضا نہیں کر سکتا — تقاضا پروٹوکول اعلان میں اور نفاذ قسم میں ہونا چاہیے۔

Protocol Extension کسی مخصوص قسم کی توسیع سے کیسے مختلف ہے؟

Protocol extension پروٹوکول اپنانے والی تمام اقسام پر لاگو ہوتا ہے۔ قسم کی توسیع صرف ایک مخصوص قسم پر لاگو ہوتی ہے۔ Protocol Extensions وراثت کے بغیر کثیر شکلیت فراہم کرتے ہیں۔

کیا Protocol Extension کو دوسری توسیع کے اندر نیسٹ کیا جا سکتا ہے؟

نہیں، Swift نیسٹڈ protocol extensions کو منع کرتا ہے۔ ہر protocol extension فائل کی سطح پر اعلان کیا جاتا ہے۔ کوڈ کو منظم کرنے کے لیے // MARK: نشانات اور علیحدہ فائلیں استعمال کریں۔

خلاصہ

  • Protocol Extension — پروٹوکول اپنانے والی تمام اقسام کے لیے ڈیفالٹ طریقہ کار کا نفاذ
  • Where clause توسیع کو صرف مخصوص اقسام تک محدود کرتی ہے
  • Default implementation اقسام کے درمیان کوڈ کی نقل کو ختم کرتا ہے
  • حسابی خصوصیات کی اجازت ہے، ذخیرہ شدہ خصوصیات — نہیں
  • جامد تقسیم — ڈیفالٹ نفاذ کال کیا جاتا ہے اگر قسم نے طریقہ کو اوور رائڈ نہیں کیا
  • POP protocol extensions کے ساتھ وراثت کو بدل دیتا ہے اور فن تعمیر کو مزید لچکدار بناتا ہے

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

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

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

مزید پڑھیں