Swift में Protocol — यह क्या है, सिंटैक्स और संभावनाएँ

लेखक: IT Sectr प्रकाशित: 2026-06-17 पढ़ने का समय: 6 मिनट

Protocol Swift में एक अनुबंध है जो आवश्यकताओं का एक सेट परिभाषित करता है जिसे कोई भी इसे अपनाने वाला प्रकार पूरा करना चाहिए। प्रोटोकॉल प्रोटोकॉल-ओरिएंटेड प्रोग्रामिंग (POP) की नींव हैं — एक प्रतिमान जिसे Apple ने क्लासिकल OOP के साथ Swift के लिए अनुशंसित किया है। Apple Documentation, 2026 के अनुसार, स्ट्रक्चर, क्लास और एनम प्रोटोकॉल अपना सकते हैं, जिससे आर्किटेक्चर लचीला और परीक्षण योग्य बनता है।

मुख्य बातें

  • Protocol — स्ट्रक्चर, क्लास और एनम के लिए आवश्यकताओं वाला अनुबंध
  • आवश्यकताएँ में मेथड, प्रॉपर्टी, इनिशियलाइज़र और सबस्क्रिप्ट शामिल हैं
  • Protocol Composition कई प्रोटोकॉल को संयोजित करने की अनुमति देता है
  • POP — प्रोटोकॉल-ओरिएंटेड प्रोग्रामिंग, इनहेरिटेंस का विकल्प
  • Protocol Extensions मेथड के लिए डिफ़ॉल्ट कार्यान्वयन जोड़ते हैं

Swift में Protocol क्या है?

Protocol एक अमूर्त इंटरफ़ेस है जो परिभाषित करता है कि एक प्रकार क्या करने में सक्षम होना चाहिए, लेकिन यह नहीं कि वह इसे कैसे करता है। Swift में, प्रोटोकॉल Java या Go के इंटरफ़ेस के समान है, लेकिन अतिरिक्त क्षमताओं के साथ।

एक प्रोटोकॉल आवश्यकता कर सकता है:

  • इंस्टेंस और टाइप मेथड (स्टैटिक)
  • प्रॉपर्टीज़ { get } या { get set } निर्दिष्टकों के साथ
  • इनिशियलाइज़र
  • सबस्क्रिप्ट
  • Associated types (प्रोटोकॉल स्तर पर जेनेरिक)

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 का उपयोग करना
  • गोलाकार प्रोटोकॉल संदर्भ — एक प्रोटोकॉल जो उचित समाधान के बिना associated type के माध्यम से स्वयं को संदर्भित करता है
  • केवल-क्लास प्रोटोकॉल — आवश्यकता के बिना AnyObject का उपयोग करना, जो स्ट्रक्चर और एनम को बाहर करता है

अक्सर पूछे जाने वाले प्रश्न

Protocol abstract class से कैसे भिन्न है?

Protocol कार्यान्वयन के बिना केवल आवश्यकताओं को परिभाषित करता है (protocol extensions तक)। Abstract class में कार्यान्वयन और स्थिति हो सकती है। Swift में कोई abstract क्लास नहीं हैं — उनकी भूमिका एक्सटेंशन वाले प्रोटोकॉल निभाते हैं।

क्या struct प्रोटोकॉल अपना सकता है?

हाँ, स्ट्रक्चर, क्लास और एनम — सभी प्रोटोकॉल अपना सकते हैं। यह POP की नींव है: आपको आर्किटेक्चर को व्यवस्थित करने के लिए क्लास का उपयोग करने की आवश्यकता नहीं है। प्रोटोकॉल वाले स्ट्रक्चर वैल्यू सिमैंटिक्स और अपरिवर्तनीयता प्रदान करते हैं।

प्रोटोकॉल में associated type क्या है?

Associated type (associatedtype) एक प्रकार के लिए प्लेसहोल्डर है जिसे लागू करने वाला प्रकार स्वयं निर्धारित करता है। उदाहरण: Collection में associatedtype Element है। यह प्रोटोकॉल स्तर पर एक जेनेरिक है।

क्या मैं प्रोटोकॉल को केवल क्लास तक सीमित कर सकता हूँ?

हाँ, AnyObject से इनहेरिटेंस जोड़ें: protocol MyProtocol: AnyObject। तब केवल क्लास ही इस प्रोटोकॉल को अपना सकेंगे। यह कमज़ोर संदर्भों और डेलीगेट के लिए उपयोगी है।

रनटाइम पर प्रोटोकॉल अनुपालन कैसे जाँचें?

जाँच के लिए is और कास्टिंग के लिए as? का उपयोग करें: if let drawable = item as? Drawable। यह केवल बिना associated types वाले प्रोटोकॉल के लिए काम करता है।

सारांश

  • Protocol — मेथड, प्रॉपर्टी, इनिशियलाइज़र और सबस्क्रिप्ट के लिए अनुबंध
  • Class, struct, enum — सभी प्रकार प्रोटोकॉल अपना सकते हैं
  • इनहेरिटेंस प्रोटोकॉल का कठोर युग्मन के बिना अनुबंधों का पदानुक्रम बनाता है
  • Protocol Composition (&) इनहेरिटेंस के बिना प्रोटोकॉल को जोड़ता है
  • एक्ज़िस्टेंशियल प्रकार (any) और अपारदर्शी प्रकार (some) — प्रोटोकॉल के साथ काम करने के दो तरीके
  • POP Apple द्वारा क्लासिकल क्लास इनहेरिटेंस के विकल्प के रूप में अनुशंसित है
  • Protocol Extensions डिफ़ॉल्ट कार्यान्वयन जोड़ने की अनुमति देते हैं

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें