Protocol — یہ کیا ہے، iOS میں پروٹوکول اور ڈیلیگیٹ

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

Protocol تقاضوں (خصوصیات اور طریقوں) کا ایک مجموعہ ہے جسے پروٹوکول اپنانے والی قسم کو پورا کرنا ہوتا ہے۔ Swift میں، پروٹوکول Protocol-Oriented Programming (POP) کا مرکزی عنصر ہیں، جو وراثت کے بغیر کثیر شکلیت کو ممکن بناتے ہیں۔ Swift.org (2025) کے مطابق، Swift معیاری لائبریری کی 85% قسموں میں پروٹوکول استعمال ہوتے ہیں۔ Objective-C میں، @protocol ایک جیسا کردار ادا کرتا ہے، لیکن ایک حد کے ساتھ — صرف کلاسز کے لیے۔

اہم نکات

  • Protocol — ایک معاہدہ جو انٹرفیس کی وضاحت کرتا ہے جسے ساخت، کلاس یا شمارندہ کو نافذ کرنا ہوتا ہے
  • Protocol-Oriented Programming — Swift نمونہ جہاں پروٹوکول اور پروٹوکول توسیعات گہری وراثت کے درجہ بندی کو بدل دیتے ہیں
  • Protocol extension — ڈیفالٹ طریقہ کار کے نفاذ، @objc کے بغیر پروٹوکول کے طریقوں کو اختیاری بناتا ہے
  • Associated types — مختلف ڈیٹا کی اقسام کے ساتھ قسم محفوظ کام کے لیے منسلک اقسام کے ساتھ عمومی پروٹوکول
  • Protocol composition — & آپریٹر کے ذریعے کئی پروٹوکولز کو ملا کر تقاضوں کی درست وضاحت

Swift میں پروٹوکول کیا ہے؟

Protocol Swift میں پروٹوکول ایک تجریدی انٹرفیس ہے جو ان تقاضوں کی وضاحت کرتا ہے جنہیں ایک قسم کو پورا کرنا چاہیے۔ ایک پروٹوکول خصوصیات (getter/setter کے ساتھ)، طریقے (مثال اور قسم)، ابتدا کار اور ذیلی اسکرپٹ کا تقاضا کر سکتا ہے۔ کلاسز کے برعکس، پروٹوکول ساختوں، شمارندوں اور کلاسز کے ذریعے اپنائے جا سکتے ہیں — جو خالصتاً کلاس پر مبنی زبانوں میں دستیاب نہ ہونے والی لچک فراہم کرتا ہے۔

Swift
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: Swift نمونہ

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 ProtocolJava InterfaceC++ Abstract Class
طریقہ کار کا نفاذہاں (extension)ہاں (default methods)ہاں
ذخیرہ شدہ خصوصیاتنہیںنہیںہاں
قدر کی اقسامہاںنہیںنہیں
متعدد نفاذہاںہاںہاں
ابتدا کارہاں (تقاضے)نہیںہاں

بنیادی فرق: Swift Protocol ابتدا کاروں اور ذیلی اسکرپٹ کا تقاضا کر سکتا ہے، جو Java Interface میں دستیاب نہیں ہے۔ تاہم، ایک پروٹوکول حالت ذخیرہ نہیں کر سکتا — یہ پروٹوکول اپنانے والی قسم کی ذمہ داری رہتا ہے۔

پروٹوکول میں Associated Types اور Generics

Associated Type (منسلک قسم) ایک پروٹوکول کے اندر ایک عمومی قسم ہے جو اپنانے والی قسم کے ذریعے ٹھوس ہوتی ہے۔ یہ ایک ٹھوس ڈیٹا کی قسم بتائے بغیر قسم محفوظ پروٹوکول بنانے کی اجازت دیتا ہے۔ منسلک اقسام Swift generics کے ساتھ مل کر کام کرتی ہیں۔

Swift
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 اور پروٹوکول توسیعات

Protocol composition — & آپریٹر کے ذریعے کئی پروٹوکولز کا امتزاج۔ ایک ترکیب کے مطابق قسم کو تمام مشترکہ پروٹوکول نافذ کرنے ہوتے ہیں۔ یہ Swift میں موجود نہ ہونے والی متعدد وراثت کو بدلتا ہے اور فنکشن پیرامیٹرز کے تقاضوں کو درست طریقے سے متعین کرنے کی اجازت دیتا ہے۔

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 کے بغیر اختیاری طریقوں کو نافذ کرتا ہے۔

Objective-C میں @protocol: Swift سے فرق

@protocol Objective-C میں @protocol Swift Protocol کا پیشرو ہے، لیکن اہم حدود کے ساتھ۔ Objective-C پروٹوکول صرف کلاسز کے لیے دستیاب ہیں (ساختوں یا شمارندوں کے لیے نہیں) اور پیغام گزرنے کے ذریعے متحرک تقسیم استعمال کرتے ہیں۔ طریقے @required (ڈیفالٹ) یا @optional ہو سکتے ہیں۔

Objective-C
@protocol Loggable
@required
- (void)logMessage: (NSString *)message;
@optional
- (NSString *)logPrefix;
@end

@interface ConsoleLogger : NSObject 
@end

@implementation ConsoleLogger
- (void)logMessage: (NSString *)message {
    NSLog(@"[LOG] %@", message);
}
@end

Swift کے برعکس، Objective-C پروٹوکول منسلک اقسام، generics، پروٹوکول توسیعات یا قدر کی اقسام کی حمایت نہیں کرتے۔ وہ کلاس پر مبنی تجرید کا ایک طریقہ کار رہتے ہیں، جبکہ Swift Protocol تمام اقسام کے لیے ایک مکمل خصوصیات والا کثیر شکلی آلہ ہے۔

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

پروٹوکول تجریدی کلاس سے کیسے مختلف ہے؟

Protocol حالت (ذخیرہ شدہ خصوصیات) ذخیرہ نہیں کر سکتا — صرف خصوصیات کے تقاضے۔ تجریدی کلاس ڈیٹا فیلڈز رکھ سکتی ہے۔ پروٹوکول ساختوں اور شمارندوں کے ذریعے اپنایا جا سکتا ہے، جبکہ تجریدی کلاس صرف کلاسز کے ذریعے ذیلی درجہ بندی کی جا سکتی ہے۔ Swift میں، پروٹوکول بنیادی تجریدی آلہ ہیں؛ کلاسز کم کثرت سے استعمال ہوتی ہیں۔

Protocol-Oriented Programming کیا ہے؟

POP ایک نمونہ ہے جہاں پروٹوکول اور پروٹوکول توسیعات گہری وراثت کے درجہ بندی کو بدل دیتے ہیں۔ ایک بنیادی کلاس کے بجائے جس سے تمام ذیلی کلاسیں وراثت پاتی ہیں، POP توسیع کے ذریعے ڈیفالٹ نفاذ کے ساتھ پروٹوکول امتزاج استعمال کرتا ہے۔ یہ انضمام کو کم کرتا ہے اور کوڈ کے دوبارہ استعمال کو بہتر بناتا ہے۔

کیا ایک پروٹوکول دوسرے پروٹوکول کو وراثت میں لے سکتا ہے؟

ہاں، Swift پروٹوکول وراثت کی حمایت کرتے ہیں۔ protocol SerializableDrawable: Drawable, Codable — ایک پروٹوکول جو Drawable اور Codable کے تقاضوں کو یکجا کرتا ہے۔ SerializableDrawable اپنانے والی قسم کو درجہ بندی میں تمام پروٹوکولز کے تقاضے پورے کرنے ہوتے ہیں۔ یہ کلاس وراثت سے مختلف ہے — پروٹوکولز کا کوئی مشترک آباؤاجداد نہیں ہوتا۔

پروٹوکول کے تناظر میں any اور some کیا ہیں؟

some (غیر شفاف قسم) ضمانت دیتا ہے کہ ایک فنکشن پروٹوکول کے مطابق ایک مخصوص قسم لوٹاتا ہے۔ any (وجودی قسم) پروٹوکول کے مطابق کسی بھی قسم کو ذخیرہ کرنے کی اجازت دیتا ہے۔ some قسم کی شناخت برقرار رکھنے کے لیے استعمال ہوتا ہے، any — متضاد مجموعوں کے لیے۔ some Swift 5.1 میں ظاہر ہوا، any — Swift 5.7 میں۔

Swift میں پروٹوکول مطابقت کی جانچ کیسے کریں؟

جانچ کے لیے is اور تبدیلی کے لیے as? استعمال کریں: if let drawable = object as? Drawable { drawable.draw(in: ctx) }۔ Objective-C میں conformsToProtocol: استعمال ہوتا ہے۔ Swift منسلک اقسام کے بغیر پروٹوکول کے لیے is جانچ کی بھی حمایت کرتا ہے۔

خلاصہ

  • Protocol — اپنانے والی قسم کے لیے خصوصیات، طریقوں، ابتدا کاروں اور ذیلی اسکرپٹ کے تقاضوں کی وضاحت کرنے والا معاہدہ
  • Protocol-Oriented Programming کلاس وراثت کو پروٹوکول امتزاج اور توسیعات سے بدل دیتا ہے
  • Protocol extension ڈیفالٹ نفاذ فراہم کرتا ہے، @objc کے بغیر طریقوں کو اختیاری بناتا ہے
  • Associated types نفاذ کی طرف قسم کی تخفیف کے ساتھ عمومی پروٹوکول بنانے کی اجازت دیتے ہیں
  • Protocol composition & کے ذریعے کئی پروٹوکولز کے تقاضوں کو یکجا کرتا ہے
  • Objective-C @protocol کلاسز تک محدود ہے اور منسلک اقسام، generics یا قدر کی اقسام کی حمایت نہیں کرتا
  • سفارش: Swift میں پروٹوکول کو بنیادی تجریدی آلہ کے طور پر استعمال کریں، صرف حوالہ جاتی مفہوم کی ضرورت ہونے پر کلاسز کا سہارا لیں

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

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

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

مزید پڑھیں