Swift میں Protocol — یہ کیا ہے، نحو اور امکانات

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

Protocol Swift میں ایک معاہدہ ہے جو ضروریات کا ایک مجموعہ متعین کرتا ہے جسے کوئی بھی اسے اپنانے والی قسم پورا کرے۔ پروٹوکول پروٹوکول پر مبنی پروگرامنگ (POP) کی بنیاد ہیں — ایک نمونہ جسے Apple نے کلاسیکل OOP کے ساتھ Swift کے لیے تجویز کیا ہے۔ Apple Documentation, 2026 کے مطابق، ساختیں، کلاسیں اور enum پروٹوکول اپنا سکتے ہیں، جس سے فن تعمیر لچکدار اور قابل آزمائش بنتا ہے۔

اہم نکات

  • Protocol — ساختیں، کلاسیں اور enum کے لیے ضروریات والا معاہدہ
  • ضروریات میں طریقے، خواص، ابتدائیہ اور ذیلی اشاریے شامل ہیں
  • Protocol Composition متعدد پروٹوکول کو یکجا کرنے کی اجازت دیتا ہے
  • POP — پروٹوکول پر مبنی پروگرامنگ، وراثت کا متبادل
  • Protocol Extensions طریقوں کے لیے طے شدہ نفاذ شامل کرتے ہیں

Swift میں Protocol کیا ہے؟

Protocol ایک تجریدی انٹرفیس ہے جو متعین کرتا ہے کہ ایک قسم کو کیا کرنے کے قابل ہونا چاہیے، لیکن یہ نہیں کہ وہ یہ کیسے کرتی ہے۔ Swift میں، ایک پروٹوکول Java یا Go کے انٹرفیس سے مشابہ ہے، لیکن اضافی صلاحیتوں کے ساتھ۔

ایک پروٹوکول درکار ہو سکتا ہے:

  • مثال اور قسم کے طریقے (جامد)
  • خواص { get } یا { get set } مشخصات کے ساتھ
  • ابتدائیہ
  • ذیلی اشاریے
  • منسلک اقسام (پروٹوکول سطح پر جنیرک)

WWDC 2015 کے مطابق، Apple نے پروٹوکول پر مبنی پروگرامنگ کو Swift اطلاقی فن تعمیر کے لیے ایک بنیادی نقطہ نظر کے طور پر متعارف کرایا۔ OOP کے برعکس، جہاں کلاس وراثت سخت درجہ بندی پیدا کرتی ہے، POP پروٹوکول ترکیب پیش کرتا ہے۔ یہ لچک فراہم کرتا ہے: ایک ہی قسم متعدد پروٹوکول کی تعمیل کر سکتی ہے، ان کی ضروریات اور نفاذ کو توسیعات کے ذریعے حاصل کر سکتی ہے۔

پروٹوکول اعلان کا نحو

Protocol کا اعلان کلیدی لفظ protocol، ایک نام اور ایک جسم سے کیا جاتا ہے۔

swift
protocol Drawable {
    func draw(context: CGContext)
    var boundingBox: CGRect { get }
}

ایک قسم اپنے نام کے بعد نقطہ دو کا استعمال کرتے ہوئے پروٹوکول اپناتی ہے:

swift
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 } سے کیا جاتا ہے۔

swift
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 کسی دوسرے پروٹوکول کو وراثت میں لے سکتا ہے، نئی ضروریات شامل کر سکتا ہے۔ یہ سخت کلاس وابستگی کے بغیر معاہدوں کا درجہ بندی بناتا ہے۔

swift
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

Protocol Composition ایک طریقہ کار ہے جو یہ متعین کرنے کی اجازت دیتا ہے کہ ایک قسم کو بیک وقت متعدد پروٹوکول کی تعمیل کرنی چاہیے، بغیر کوئی نیا مشترکہ پروٹوکول بنائے۔

swift
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 کو متغیر، فنکشن پیرامیٹر یا مجموعہ عنصر کی قسم کے طور پر استعمال کیا جا سکتا ہے۔ اسے وجودی قسم کہا جاتا ہے۔

swift
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 میں ایک معیاری طریقہ ہے۔

پروٹوکول کے ساتھ عام غلطیاں

پروٹوکول کے ساتھ کام کرتے وقت، ڈیولپرز اکثر کئی بار بار آنے والی غلطیاں کرتے ہیں۔

  • mutating بھول جانا — ایک طریقہ پروٹوکول میں mutating کے طور پر نشان زد ہے، لیکن ساخت اسے کلیدی لفظ کے بغیر نافذ کرتی ہے
  • جنیرک کے بجائے پروٹوکول کو قسم کے طور پر استعمال کرنا — جہاں ٹھوس قسم کی ضرورت ہو وہاں <T: Drawable> کی بجائے Drawable استعمال کرنا
  • مدور پروٹوکول حوالہ — ایک پروٹوکول جو مناسب حل کے بغیر منسلک قسم کے ذریعے خود حوالہ کرتا ہے
  • صرف کلاس پروٹوکول — ضرورت کے بغیر AnyObject استعمال کرنا، جو struct اور enum کو خارج کرتا ہے

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

Protocol abstract class سے کیسے مختلف ہے؟

Protocol نفاذ کے بغیر صرف ضروریات متعین کرتا ہے (protocol extensions تک)۔ Abstract class میں نفاذ اور حالت ہو سکتی ہے۔ Swift میں کوئی تجریدی کلاسیں نہیں ہیں — ان کا کردار توسیعات والے پروٹوکول ادا کرتے ہیں۔

کیا struct پروٹوکول اپنا سکتی ہے؟

جی ہاں، ساختیں، کلاسیں اور enum — سب پروٹوکول اپنا سکتے ہیں۔ یہ POP کی بنیاد ہے: فن تعمیر کو منظم کرنے کے لیے آپ کو کلاس استعمال کرنے کی ضرورت نہیں ہے۔ پروٹوکول والی ساختیں قدر معنویات اور ناقابل تبدیلی فراہم کرتی ہیں۔

پروٹوکول میں منسلک قسم کیا ہے؟

منسلک قسم (associatedtype) ایک قسم کے لیے جگہ دار ہے جسے نافذ کرنے والی قسم خود متعین کرتی ہے۔ مثال: Collection میں associatedtype Element ہے۔ یہ پروٹوکول سطح پر ایک جنیرک ہے۔

کیا میں پروٹوکول کو صرف کلاسز تک محدود کر سکتا ہوں؟

جی ہاں، AnyObject سے وراثت شامل کریں: protocol MyProtocol: AnyObject۔ تب صرف کلاسیں ہی اس پروٹوکول کو اپنا سکیں گی۔ یہ کمزور حوالوں اور نمائندوں کے لیے مفید ہے۔

رن ٹائم پر پروٹوکول کی تعمیل کیسے جانچی جائے؟

جانچ کے لیے is اور تبدیلی کے لیے as? استعمال کریں: if let drawable = item as? Drawable۔ یہ صرف منسلک اقسام کے بغیر پروٹوکول کے لیے کام کرتا ہے۔

خلاصہ

  • Protocol — طریقوں، خواص، ابتدائیہ اور ذیلی اشاریوں کے لیے معاہدہ
  • Class, struct, enum — تمام اقسام پروٹوکول اپنا سکتی ہیں
  • وراثت سخت وابستگی کے بغیر معاہدوں کا درجہ بندی بناتی ہے
  • Protocol Composition (&) وراثت کے بغیر پروٹوکول کو یکجا کرتا ہے
  • وجودی اقسام (any) اور دھندلی اقسام (some) — پروٹوکول کے ساتھ کام کرنے کے دو طریقے
  • POP Apple کی طرف سے کلاسیکل کلاس وراثت کے متبادل کے طور پر تجویز کردہ
  • Protocol Extensions طے شدہ نفاذ شامل کرنے کی اجازت دیتے ہیں

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

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

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

مزید پڑھیں