Protocol تقاضوں (خصوصیات اور طریقوں) کا ایک مجموعہ ہے جسے پروٹوکول اپنانے والی قسم کو پورا کرنا ہوتا ہے۔ Swift میں، پروٹوکول Protocol-Oriented Programming (POP) کا مرکزی عنصر ہیں، جو وراثت کے بغیر کثیر شکلیت کو ممکن بناتے ہیں۔ Swift.org (2025) کے مطابق، Swift معیاری لائبریری کی 85% قسموں میں پروٹوکول استعمال ہوتے ہیں۔ Objective-C میں، @protocol ایک جیسا کردار ادا کرتا ہے، لیکن ایک حد کے ساتھ — صرف کلاسز کے لیے۔
اہم نکات
Protocol Swift میں پروٹوکول ایک تجریدی انٹرفیس ہے جو ان تقاضوں کی وضاحت کرتا ہے جنہیں ایک قسم کو پورا کرنا چاہیے۔ ایک پروٹوکول خصوصیات (getter/setter کے ساتھ)، طریقے (مثال اور قسم)، ابتدا کار اور ذیلی اسکرپٹ کا تقاضا کر سکتا ہے۔ کلاسز کے برعکس، پروٹوکول ساختوں، شمارندوں اور کلاسز کے ذریعے اپنائے جا سکتے ہیں — جو خالصتاً کلاس پر مبنی زبانوں میں دستیاب نہ ہونے والی لچک فراہم کرتا ہے۔
protocol Drawable {
var boundingRect: CGRect { get }
mutating func draw(in context: CGContext)
}
struct Circle: Drawable {
var center: CGPoint
var radius: CGFloat
var boundingRect: CGRect {
CGRect(x: center.x - radius, y: center.y - radius,
width: radius * 2, height: radius * 2)
}
func draw(in context: CGContext) {
context.addEllipse(in: boundingRect)
}
}Circle ساخت Drawable پروٹوکول اپناتی ہے، جو boundingRect خصوصیت اور draw(in:) طریقہ فراہم کرتی ہے۔ پروٹوکول کی بدولت، Drawable کو نافذ کرنے والی کوئی بھی شکل یکساں طور پر سنبھالی جا سکتی ہے — یہ ایک مشترکہ بنیادی کلاس سے وراثت کے بغیر کثیر شکلیت ہے۔
Protocol-Oriented Programming (POP) ایک نمونہ ہے جسے Apple نے WWDC 2015 میں کلاس پر مبنی وراثت کے متبادل کے طور پر متعارف کرایا تھا۔ POP میں، پروٹوکول بنیادی تجریدی آلہ ہیں اور پروٹوکول توسیعات ڈیفالٹ نفاذ فراہم کرتی ہیں۔ یہ «ہیرے کی وراثت» کے مسئلے کو حل کرتا ہے اور ماخذ کوڈ میں ترمیم کیے بغیر موجودہ اقسام کو بڑھانے کی اجازت دیتا ہے۔
| پہلو | POP (پروٹوکول پر مبنی) | OOP (کلاس پر مبنی) |
|---|---|---|
| تجرید کی اکائی | Protocol | بنیادی کلاس |
| دوبارہ استعمال کا طریقہ کار | Protocol extension | وراثت |
| قدر کی اقسام | معاونت یافتہ (struct) | صرف حوالہ جاتی اقسام |
| متعدد اپنانا | Protocol composition | متعدد وراثت (Swift میں نہیں) |
| انضمام کا خطرہ | کم (ڈھیلا انضمام) | زیادہ (سخت درجہ بندی) |
Apple Swift بلاگ (2025) کے مطابق، جدید Swift ایپلیکیشنز میں 70% اقسام ساختیں ہیں۔ POP اس تبدیلی کی ایک اہم وجہ ہے: پروٹوکول ساختوں کو کلاسز میں منتقل ہوئے بغیر کثیر شکلی طرز عمل حاصل کرنے کی اجازت دیتے ہیں۔
Swift پروٹوکول Java انٹرفیس اور C++ تجریدی کلاسز کے درمیان ایک درمیانی پوزیشن رکھتے ہیں۔ ان میں نفاذ شامل ہو سکتے ہیں (توسیعات کے ذریعے) لیکن حالت (ذخیرہ شدہ خصوصیات) نہیں رکھ سکتے۔ آئیے تین زبانوں میں فرق کا جائزہ لیتے ہیں۔
| خصوصیت | Swift Protocol | Java Interface | C++ Abstract Class |
|---|---|---|---|
| طریقہ کار کا نفاذ | ہاں (extension) | ہاں (default methods) | ہاں |
| ذخیرہ شدہ خصوصیات | نہیں | نہیں | ہاں |
| قدر کی اقسام | ہاں | نہیں | نہیں |
| متعدد نفاذ | ہاں | ہاں | ہاں |
| ابتدا کار | ہاں (تقاضے) | نہیں | ہاں |
بنیادی فرق: Swift Protocol ابتدا کاروں اور ذیلی اسکرپٹ کا تقاضا کر سکتا ہے، جو Java Interface میں دستیاب نہیں ہے۔ تاہم، ایک پروٹوکول حالت ذخیرہ نہیں کر سکتا — یہ پروٹوکول اپنانے والی قسم کی ذمہ داری رہتا ہے۔
Associated Type (منسلک قسم) ایک پروٹوکول کے اندر ایک عمومی قسم ہے جو اپنانے والی قسم کے ذریعے ٹھوس ہوتی ہے۔ یہ ایک ٹھوس ڈیٹا کی قسم بتائے بغیر قسم محفوظ پروٹوکول بنانے کی اجازت دیتا ہے۔ منسلک اقسام Swift generics کے ساتھ مل کر کام کرتی ہیں۔
protocol Container {
associatedtype Item
var count: Int { get }
mutating func append(_ item: Item)
subscript(i: Int) -> Item { get }
}
struct IntStack: Container {
var items: [Int] = []
var count: Int { items.count }
typealias Item = Int
mutating func append(_ item: Int) {
items.append(item)
}
subscript(i: Int) -> Int {
items[i]
}
}
func sum<C: Container>(_ container: C) -> C.Item where C.Item: Numeric {
// فنکشن کا جسم
}Container associatedtype Item کے ساتھ ایک پروٹوکول ہے۔ IntStack اسے typealias Item = Int بتا کر نافذ کرتا ہے۔ عمومی فنکشن sum صرف عددی کنٹینرز کے ساتھ کام کرنے کے لیے where شق استعمال کرتا ہے۔ منسلک اقسام قسم کی حفاظت کھوئے بغیر پروٹوکول کو عمومی بناتی ہیں۔
Protocol composition — & آپریٹر کے ذریعے کئی پروٹوکولز کا امتزاج۔ ایک ترکیب کے مطابق قسم کو تمام مشترکہ پروٹوکول نافذ کرنے ہوتے ہیں۔ یہ Swift میں موجود نہ ہونے والی متعدد وراثت کو بدلتا ہے اور فنکشن پیرامیٹرز کے تقاضوں کو درست طریقے سے متعین کرنے کی اجازت دیتا ہے۔
protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }
struct Person: Named, Aged {
let name: String
let age: Int
}
func greet(_ entity: Named & Aged) {
print("ہیلو، \(entity.name)، عمر \(entity.age)!")
}
// Protocol extension — ڈیفالٹ نفاذ
extension Named {
func introduce() {
print("میرا نام \(name) ہے")
}
}Protocol extension ڈیفالٹ طریقہ کار کے نفاذ فراہم کرتا ہے۔ پروٹوکول اپنانے والی قسم توسیع کے طریقہ کار کو اوور رائڈ کر سکتی ہے — اس صورت میں، اس کا اپنا نفاذ کہا جاتا ہے۔ یہ وہ طریقہ کار ہے جس کے ذریعے Swift @objc کے بغیر اختیاری طریقوں کو نافذ کرتا ہے۔
@protocol Objective-C میں @protocol Swift Protocol کا پیشرو ہے، لیکن اہم حدود کے ساتھ۔ Objective-C پروٹوکول صرف کلاسز کے لیے دستیاب ہیں (ساختوں یا شمارندوں کے لیے نہیں) اور پیغام گزرنے کے ذریعے متحرک تقسیم استعمال کرتے ہیں۔ طریقے @required (ڈیفالٹ) یا @optional ہو سکتے ہیں۔
@protocol Loggable
@required
- (void)logMessage: (NSString *)message;
@optional
- (NSString *)logPrefix;
@end
@interface ConsoleLogger : NSObject
@end
@implementation ConsoleLogger
- (void)logMessage: (NSString *)message {
NSLog(@"[LOG] %@", message);
}
@endSwift کے برعکس، Objective-C پروٹوکول منسلک اقسام، generics، پروٹوکول توسیعات یا قدر کی اقسام کی حمایت نہیں کرتے۔ وہ کلاس پر مبنی تجرید کا ایک طریقہ کار رہتے ہیں، جبکہ Swift Protocol تمام اقسام کے لیے ایک مکمل خصوصیات والا کثیر شکلی آلہ ہے۔
اکثر پوچھے گئے سوالات
Protocol حالت (ذخیرہ شدہ خصوصیات) ذخیرہ نہیں کر سکتا — صرف خصوصیات کے تقاضے۔ تجریدی کلاس ڈیٹا فیلڈز رکھ سکتی ہے۔ پروٹوکول ساختوں اور شمارندوں کے ذریعے اپنایا جا سکتا ہے، جبکہ تجریدی کلاس صرف کلاسز کے ذریعے ذیلی درجہ بندی کی جا سکتی ہے۔ Swift میں، پروٹوکول بنیادی تجریدی آلہ ہیں؛ کلاسز کم کثرت سے استعمال ہوتی ہیں۔
POP ایک نمونہ ہے جہاں پروٹوکول اور پروٹوکول توسیعات گہری وراثت کے درجہ بندی کو بدل دیتے ہیں۔ ایک بنیادی کلاس کے بجائے جس سے تمام ذیلی کلاسیں وراثت پاتی ہیں، POP توسیع کے ذریعے ڈیفالٹ نفاذ کے ساتھ پروٹوکول امتزاج استعمال کرتا ہے۔ یہ انضمام کو کم کرتا ہے اور کوڈ کے دوبارہ استعمال کو بہتر بناتا ہے۔
ہاں، Swift پروٹوکول وراثت کی حمایت کرتے ہیں۔ protocol SerializableDrawable: Drawable, Codable — ایک پروٹوکول جو Drawable اور Codable کے تقاضوں کو یکجا کرتا ہے۔ SerializableDrawable اپنانے والی قسم کو درجہ بندی میں تمام پروٹوکولز کے تقاضے پورے کرنے ہوتے ہیں۔ یہ کلاس وراثت سے مختلف ہے — پروٹوکولز کا کوئی مشترک آباؤاجداد نہیں ہوتا۔
some (غیر شفاف قسم) ضمانت دیتا ہے کہ ایک فنکشن پروٹوکول کے مطابق ایک مخصوص قسم لوٹاتا ہے۔ any (وجودی قسم) پروٹوکول کے مطابق کسی بھی قسم کو ذخیرہ کرنے کی اجازت دیتا ہے۔ some قسم کی شناخت برقرار رکھنے کے لیے استعمال ہوتا ہے، any — متضاد مجموعوں کے لیے۔ some Swift 5.1 میں ظاہر ہوا، any — Swift 5.7 میں۔
جانچ کے لیے is اور تبدیلی کے لیے as? استعمال کریں: if let drawable = object as? Drawable { drawable.draw(in: ctx) }۔ Objective-C میں conformsToProtocol: استعمال ہوتا ہے۔ Swift منسلک اقسام کے بغیر پروٹوکول کے لیے is جانچ کی بھی حمایت کرتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں