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 जेनेरिक के साथ मिलकर काम करते हैं।
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 में 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 प्रोटोकॉल संबद्ध प्रकारों, जेनेरिक, प्रोटोकॉल एक्सटेंशन या मान प्रकारों का समर्थन नहीं करते। वे वर्ग-आधारित अमूर्तन का एक तंत्र बने हुए हैं, जबकि Swift Protocol सभी प्रकारों के लिए एक पूर्ण-विशेषताओं वाला पॉलिमॉर्फ़िज़्म उपकरण है।
अक्सर पूछे जाने वाले प्रश्न
Protocol अवस्था (संग्रहीत गुण) संग्रहीत नहीं कर सकता — केवल गुण आवश्यकताएँ। Abstract class डेटा फ़ील्ड शामिल कर सकता है। Protocol को संरचनाओं और गणनाओं द्वारा अपनाया जा सकता है, जबकि abstract class को केवल कक्षाओं द्वारा उपवर्गित किया जा सकता है। 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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें