Protocol Swift میں ایک معاہدہ ہے جو ضروریات کا ایک مجموعہ متعین کرتا ہے جسے کوئی بھی اسے اپنانے والی قسم پورا کرے۔ پروٹوکول پروٹوکول پر مبنی پروگرامنگ (POP) کی بنیاد ہیں — ایک نمونہ جسے Apple نے کلاسیکل OOP کے ساتھ Swift کے لیے تجویز کیا ہے۔ Apple Documentation, 2026 کے مطابق، ساختیں، کلاسیں اور enum پروٹوکول اپنا سکتے ہیں، جس سے فن تعمیر لچکدار اور قابل آزمائش بنتا ہے۔
اہم نکات
Protocol ایک تجریدی انٹرفیس ہے جو متعین کرتا ہے کہ ایک قسم کو کیا کرنے کے قابل ہونا چاہیے، لیکن یہ نہیں کہ وہ یہ کیسے کرتی ہے۔ Swift میں، ایک پروٹوکول Java یا Go کے انٹرفیس سے مشابہ ہے، لیکن اضافی صلاحیتوں کے ساتھ۔
ایک پروٹوکول درکار ہو سکتا ہے:
{ get } یا { get set } مشخصات کے ساتھWWDC 2015 کے مطابق، Apple نے پروٹوکول پر مبنی پروگرامنگ کو Swift اطلاقی فن تعمیر کے لیے ایک بنیادی نقطہ نظر کے طور پر متعارف کرایا۔ OOP کے برعکس، جہاں کلاس وراثت سخت درجہ بندی پیدا کرتی ہے، POP پروٹوکول ترکیب پیش کرتا ہے۔ یہ لچک فراہم کرتا ہے: ایک ہی قسم متعدد پروٹوکول کی تعمیل کر سکتی ہے، ان کی ضروریات اور نفاذ کو توسیعات کے ذریعے حاصل کر سکتی ہے۔
Protocol کا اعلان کلیدی لفظ protocol، ایک نام اور ایک جسم سے کیا جاتا ہے۔
protocol Drawable {
func draw(context: CGContext)
var boundingBox: CGRect { get }
}
ایک قسم اپنے نام کے بعد نقطہ دو کا استعمال کرتے ہوئے پروٹوکول اپناتی ہے:
struct Circle: Drawable {
let center: CGPoint
let radius: CGFloat
func draw(context: CGContext) {
context.addArc(center: center, radius: radius, ...)
}
var boundingBox: CGRect {
CGRect(x: center.x - radius, y: center.y - radius,
width: radius * 2, height: radius * 2)
}
}
ایک ہی قسم کوما سے الگ کر کے متعدد پروٹوکول اپنا سکتی ہے: struct MyType: ProtocolA, ProtocolB۔ مرتب کنندہ تصدیق کرتا ہے کہ ہر پروٹوکول کی تمام ضروریات پوری ہوئی ہیں۔
خاصیت کی ضروریات کا اعلان کلیدی لفظ var اور رسائی کی مشخصات { get } یا { get set } سے کیا جاتا ہے۔
protocol UserProtocol {
var name: String { get }
var age: Int { get set }
static var maxAge: Int { get }
mutating func updateName(_ newName: String)
}
پروٹوکول میں کلیدی لفظ mutating اس بات کی نشاندہی کرتا ہے کہ طریقہ self کو تبدیل کر سکتا ہے۔ ساختیں ایسے طریقے کو mutating کے طور پر نافذ کریں گی، جبکہ کلاسیں اسے چھوڑ سکتی ہیں۔ طریقے کی ضروریات کا اعلان مکمل دستخط کے ساتھ کیا جاتا ہے، جس میں پیرامیٹر لیبل شامل ہیں۔
Protocol کسی دوسرے پروٹوکول کو وراثت میں لے سکتا ہے، نئی ضروریات شامل کر سکتا ہے۔ یہ سخت کلاس وابستگی کے بغیر معاہدوں کا درجہ بندی بناتا ہے۔
protocol Vehicle {
var speed: Double { get set }
func move()
}
protocol Flyable: Vehicle {
var altitude: Double { get set }
func takeOff()
}
Flyable اپنانے والی قسم کو دونوں پروٹوکول — Vehicle اور Flyable — کی ضروریات پوری کرنی ہوں گی۔ Swift پروٹوکول کی متعدد وراثت کی حمایت کرتا ہے: protocol A: B, C۔
Protocol Composition ایک طریقہ کار ہے جو یہ متعین کرنے کی اجازت دیتا ہے کہ ایک قسم کو بیک وقت متعدد پروٹوکول کی تعمیل کرنی چاہیے، بغیر کوئی نیا مشترکہ پروٹوکول بنائے۔
func render(_ item: Drawable & Animatable) {
item.draw(context: ...)
item.animate(duration: 0.3)
}
ترکیب (&) فنکشن پیرامیٹرز، متغیرات اور جنیرک رکاوٹوں میں کام کرتی ہے۔ مرتب کنندہ تصدیق کرتا ہے کہ منتقل کردہ قسم بیک وقت تمام پروٹوکول کو پورا کرتی ہے۔ ترکیب SwiftUI میں وسیع پیمانے پر استعمال ہوتی ہے: some View ترکیب کے ساتھ ایک جنیرک ہے۔
Protocol Composition وراثت کا درجہ بندی بنانے سے بہتر ہے: protocol A: B, C کے بجائے براہ راست B & C اپنایا جا سکتا ہے۔ یہ لچک فراہم کرتا ہے اور وابستگی کو کم کرتا ہے۔ ترکیب خاص طور پر فنکشن پیرامیٹرز اور جنیرک رکاوٹوں میں مفید ہے جہاں درمیانی پروٹوکول بنائے بغیر عارضی طور پر ضروریات کو یکجا کرنے کی ضرورت ہو۔ یہ کوڈ میں معاون اقسام کی تعداد کو کم کرتا ہے۔
Protocol کو متغیر، فنکشن پیرامیٹر یا مجموعہ عنصر کی قسم کے طور پر استعمال کیا جا سکتا ہے۔ اسے وجودی قسم کہا جاتا ہے۔
var drawableItem: Drawable
let items: [Drawable] = [Circle(...), Rectangle(...)]
func process(drawables: [any Drawable]) {
for item in drawables {
item.draw(context: ...)
}
}
کلیدی لفظ any (Swift 5.6+) واضح طور پر وجودی کو نشان زد کرتا ہے۔ any کے بغیر، مرتب کنندہ ایک انتباہ جاری کرتا ہے۔ Swift some (دھندلی اقسام) کی بھی حمایت کرتا ہے تاکہ کسی پروٹوکول کے پیچھے ٹھوس قسم کو چھپایا جا سکے — یہ SwiftUI میں ایک معیاری طریقہ ہے۔
پروٹوکول کے ساتھ کام کرتے وقت، ڈیولپرز اکثر کئی بار بار آنے والی غلطیاں کرتے ہیں۔
<T: Drawable> کی بجائے Drawable استعمال کرناAnyObject استعمال کرنا، جو struct اور enum کو خارج کرتا ہےاکثر پوچھے گئے سوالات
Protocol نفاذ کے بغیر صرف ضروریات متعین کرتا ہے (protocol extensions تک)۔ Abstract class میں نفاذ اور حالت ہو سکتی ہے۔ Swift میں کوئی تجریدی کلاسیں نہیں ہیں — ان کا کردار توسیعات والے پروٹوکول ادا کرتے ہیں۔
جی ہاں، ساختیں، کلاسیں اور enum — سب پروٹوکول اپنا سکتے ہیں۔ یہ POP کی بنیاد ہے: فن تعمیر کو منظم کرنے کے لیے آپ کو کلاس استعمال کرنے کی ضرورت نہیں ہے۔ پروٹوکول والی ساختیں قدر معنویات اور ناقابل تبدیلی فراہم کرتی ہیں۔
منسلک قسم (associatedtype) ایک قسم کے لیے جگہ دار ہے جسے نافذ کرنے والی قسم خود متعین کرتی ہے۔ مثال: Collection میں associatedtype Element ہے۔ یہ پروٹوکول سطح پر ایک جنیرک ہے۔
جی ہاں، AnyObject سے وراثت شامل کریں: protocol MyProtocol: AnyObject۔ تب صرف کلاسیں ہی اس پروٹوکول کو اپنا سکیں گی۔ یہ کمزور حوالوں اور نمائندوں کے لیے مفید ہے۔
جانچ کے لیے is اور تبدیلی کے لیے as? استعمال کریں: if let drawable = item as? Drawable۔ یہ صرف منسلک اقسام کے بغیر پروٹوکول کے لیے کام کرتا ہے۔
خلاصہ
&) وراثت کے بغیر پروٹوکول کو یکجا کرتا ہےany) اور دھندلی اقسام (some) — پروٹوکول کے ساتھ کام کرنے کے دو طریقےہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں