Protocol Extension ایک Swift میکانزم ہے جو کسی پروٹوکول کے لیے طریقوں اور خصوصیات کے ڈیفالٹ نفاذ فراہم کرنے کی اجازت دیتا ہے۔ where پابندیوں کے ساتھ مل کر، protocol extension صرف ان اقسام میں رویہ شامل کرنا ممکن بناتا ہے جو مخصوص شرائط کو پورا کرتی ہیں۔ Apple Documentation, 2026 کے مطابق، یہ پروٹوکول پر مبنی پروگرامنگ کا ایک اہم عنصر ہے، جو کلاس کے درجہ بندی کے بغیر کوڈ کے دوبارہ استعمال کو قابل بناتا ہے۔
اہم نکات
Protocol Extension موجودہ پروٹوکول میں طریقوں اور حسابی خصوصیات کے نفاذ کو شامل کرنے کا ایک طریقہ ہے۔ توسیعات کے بغیر، پروٹوکول صرف تقاضوں کی وضاحت کرتا ہے، اور ہر قسم انہیں انفرادی طور پر نافذ کرتی ہے۔
Protocol Extension کوڈ کی نقل کے مسئلے کو حل کرتا ہے: اگر پانچ structs ایک ہی پروٹوکول کو اپناتی ہیں اور ایک ہی طریقہ نافذ کرتی ہیں، تو توسیع ایک بار ڈیفالٹ نفاذ فراہم کرتی ہے۔
Swift Evolution proposal SE-0186 کے مطابق، protocol extensions ان اہم خصوصیات میں سے ہیں جنہوں نے POP کی کامیابی کو پیش کیا۔ وہ بنیادی کلاسیں بنائے بغیر اور واحد ذمہ داری کے اصول کی خلاف ورزی کیے بغیر مشترکہ رویہ شامل کرنے کی اجازت دیتے ہیں۔
Protocol Extension ایک عام توسیع کی طرح اعلان کیا جاتا ہے لیکن ایک قسم کے بجائے پروٹوکول کے نام کے ساتھ۔
protocol Greetable {
var name: String { get }
func greet() -> String
}
extension Greetable {
func greet() -> String {
return "Hello, \(name)!"
}
}
اب کوئی بھی قسم جو Greetable کو اپناتی ہے خود بخود greet کا نفاذ حاصل کرتی ہے:
struct Person: Greetable {
let name: String
}
// Person خود بخود greet() رکھتا ہے
let user = Person(name: "Alice")
print(user.greet()) // "ہیلو، Alice!"
Protocol Extension میں حسابی خصوصیات شامل ہو سکتی ہیں لیکن ذخیرہ شدہ خصوصیات نہیں (پروٹوکول اسٹوریج کی وضاحت نہیں کر سکتے)۔ آپ توسیعات کے ذریعے subscript اور نیسٹڈ اقسام بھی شامل کر سکتے ہیں۔
ڈیفالٹ نفاذ protocol extension کا بنیادی استعمال ہے۔ ایک قسم اپنا ورژن فراہم کر کے طریقہ کو اوور رائڈ کر سکتی ہے۔
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)
}
}
کلاس وراثت سے ایک اہم فرق: اگر قسم خود پروٹوکول کے طریقہ کو نافذ کرتی ہے، تو اس کا نفاذ کال کیا جاتا ہے۔ اگر نہیں، تو توسیع سے ڈیفالٹ استعمال ہوتا ہے۔ یہ جامد تقسیم ہے — فیصلہ مرتب وقت پر کیا جاتا ہے۔
Where شق protocol extension کو صرف ان اقسام تک محدود کرنے کی اجازت دیتی ہے جو اضافی شرائط کو پورا کرتی ہیں۔ یہ خصوصی رویہ شامل کرنے کے لیے ایک طاقتور میکانزم ہے۔
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 شقیں خاص طور پر مفید ہیں:
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: Equatablewhere Element == Stringwhere Element: Numeric, Element: Comparableیہ protocol extension کو عام پروٹوکول کے نفاذ کو آلودہ کیے بغیر خصوصی رویہ شامل کرنے کے لیے ایک طاقتور میکانزم بناتا ہے۔
بہت سے ڈویلپر سوچتے ہیں: protocol extensions کب استعمال کریں اور کلاس وراثت کب؟ جواب فن تعمیر کے نمونے پر منحصر ہے۔
| خصوصیت | Protocol Extension | کلاس وراثت |
|---|---|---|
| قدر کی اقسام | struct اور enum کے ساتھ کام کرتا ہے | صرف کلاسیں |
| متعدد اپنانا | ایک قسم کئی پروٹوکول اپنا سکتی ہے | ایک سپرکلاس |
| حالت | کوئی ذخیرہ شدہ خصوصیات نہیں | ذخیرہ شدہ خصوصیات ہو سکتی ہیں |
| تقسیم | جامد تقسیم (ڈیفالٹ) | متحرک تقسیم (ورچوئل ٹیبلز) |
Apple protocol + extension سے شروع کرنے اور صرف مشترکہ حالت یا شناخت (حوالہ سیمنٹکس) کی ضرورت ہونے پر کلاسوں پر سوئچ کرنے کی سفارش کرتا ہے۔ Protocol Extensions وراثت کے بجائے کمپوزیشن فراہم کرتے ہیں — ایک زیادہ لچکدار اور قابل آزمائش طریقہ۔
عملی طور پر، protocol extensions اکثر پروٹوکول کی ضروریات کے اوپر آسان ریپر طریقے شامل کرنے کے لیے استعمال ہوتے ہیں۔ مثال کے طور پر، اگر کوئی پروٹوکول تفصیلی رپورٹ کے ساتھ validate طریقہ کا تقاضا کرتا ہے، تو توسیع isValid طریقہ شامل کر سکتی ہے جو مکمل ورژن کی بنیاد پر بولین ویلیو لوٹاتا ہے۔ یہ پروٹوکول معاہدے کو تبدیل کیے بغیر کلائنٹ کوڈ کو آسان بناتا ہے۔ اس نمونے کو “ماخوذ API کے ساتھ ڈیفالٹ نفاذ” کہا جاتا ہے اور Swift معیاری لائبریری اور مشہور تیسری پارٹی فریم ورکس میں بڑے پیمانے پر استعمال ہوتا ہے۔ یہ عمل میں پروٹوکول پر مبنی پروگرامنگ کی کلیدی تکنیکوں میں سے ایک ہے اور لچکدار فن تعمیر کی بنیاد ہے۔
اکثر پوچھے گئے سوالات
نہیں، protocol extension میں صرف حسابی خصوصیات ہو سکتی ہیں۔ ذخیرہ شدہ خصوصیات ممنوع ہیں کیونکہ پروٹوکول میموری کا مالک نہیں ہے — ٹھوس قسم (struct, class, enum) ڈیٹا ذخیرہ کرنے کی ذمہ دار ہے۔
جامد تقسیم استعمال کی جاتی ہے: اگر قسم واضح طور پر طریقہ کو نافذ کرتی ہے، تو اس کا ورژن کال کیا جاتا ہے۔ اگر نہیں، تو توسیع سے ڈیفالٹ استعمال ہوتا ہے۔ existential (any) کے ذریعے رسائی کرتے وقت، متحرک تقسیم کا اطلاق ہوتا ہے۔
ہاں، protocol extension میں ابتدا کار شامل ہو سکتے ہیں۔ تاہم، پروٹوکول توسیع کے ذریعے init کا تقاضا نہیں کر سکتا — تقاضا پروٹوکول اعلان میں اور نفاذ قسم میں ہونا چاہیے۔
Protocol extension پروٹوکول اپنانے والی تمام اقسام پر لاگو ہوتا ہے۔ قسم کی توسیع صرف ایک مخصوص قسم پر لاگو ہوتی ہے۔ Protocol Extensions وراثت کے بغیر کثیر شکلیت فراہم کرتے ہیں۔
نہیں، Swift نیسٹڈ protocol extensions کو منع کرتا ہے۔ ہر protocol extension فائل کی سطح پر اعلان کیا جاتا ہے۔ کوڈ کو منظم کرنے کے لیے // MARK: نشانات اور علیحدہ فائلیں استعمال کریں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں