जावा में स्विफ्ट बनाम इंटरफ़ेस में प्रोटोकॉल की तुलना करें


149

मैं Apple डेवलपर पेज से iOS ट्यूटोरियल से गुजर रहा हूं ।

यह मुझे लगता है कि protocolऔर interfaceलगभग एक ही कार्यक्षमता है।

  • क्या दोनों के बीच कोई मतभेद हैं?

  • परियोजना में अलग उपयोग?

अपडेट किया गया

हां , मैंने ऊपर लिंक पढ़ा था और मुझे अभी भी यकीन नहीं है कि क्या अंतर और उपयोग के बीच protocolऔर है interface। जब मैं इस तरह का प्रश्न पूछता हूं, तो मैं विषय के बारे में एक सरल व्याख्या देखना चाहूंगा। कुछ समय के लिए प्रलेखन से सब कुछ प्राप्त करना कठिन हो सकता है।


1
जावा में स्विफ्ट और इंटरफेस में प्रोटोकॉल समान अवधारणाएं हैं। यहां
विवेक मोलकर

69
मुझे लगता है कि भाषाओं के बीच अंतर के बारे में इस तरह के सवाल भाषा सुविधाओं को समझने के लिए वास्तव में उपयोगी हैं। और मुझे नहीं लगता कि वे अनावश्यक राय का जवाब देते हैं और न ही प्रलेखन में उत्तर खोजना बहुत आसान है। इसलिए मुझे नहीं लगता कि इस सवाल पर नीचे दिए गए वोट उचित हैं।
Lii

1
यहाँ जावा इंटरफेस के बारे में महत्वपूर्ण वास्तविक दुनिया के कुछ बिंदु हैं - stackoverflow.com/a/41143492/294884 - जो स्विफ्ट के साथ
फेटी

दूसरी दिशा में, यह याद है कि स्विफ्ट की पूरी जेल डी'त्रे को याद है कि यह "प्रोटोकॉल प्रोग्रामिंग" के लिए है। आप सब कुछ "प्रोटोकॉल एक्सटेंशन" के साथ स्विफ्ट में सर्वव्यापी रूप से करते हैं। उदाहरण के लिए यहां स्विफ्ट के बारे में एक सूक्ष्म मुद्दा है (यानी: "प्रोटोकॉल एक्सटेंशन के बारे में") जो कुछ मुद्दों को दिखाता है।
फेटी

2
स्विफ्ट में, इंटरफेस के बजाय, प्रोटोकॉल नाम का उपयोग किया जाता है क्योंकि C से ऑब्जेक्टिव C हेडर फाइल (बेकार डुप्लिकेट) को इंटरफेस कहा जाता है
एलेक्स78191

जवाबों:


117

अनिवार्य रूप से प्रोटोकॉल जावा इंटरफेस को छोड़कर बहुत समान हैं:

  • स्विफ्ट प्रोटोकॉल उन गुणों को भी निर्दिष्ट कर सकते हैं जिन्हें लागू किया जाना चाहिए (अर्थात फ़ील्ड)
  • स्विफ्ट प्रोटोकॉल को म्यूटिंग कीवर्ड के उपयोग के माध्यम से मूल्य / संदर्भ से निपटने की आवश्यकता है (क्योंकि प्रोटोकॉल स्ट्रक्चर्स और कक्षाओं द्वारा लागू किया जा सकता है)
  • आप किसी भी बिंदु पर प्रोटोकॉल <> कीवर्ड के साथ प्रोटोकॉल को जोड़ सकते हैं। उदाहरण के लिए, एक फ़ंक्शन पैरामीटर की घोषणा करना जो प्रोटोकॉल ए और बी का पालन करना चाहिए:

func foo ( var1 : protocol<A, B> ){}

ये जावा डेवलपर के लिए तुरंत स्पष्ट अंतर हैं (या कम से कम जो मैंने अब तक देखा है)।


13
" प्रोटोकॉल <> कीवर्ड ": यह वास्तव में अच्छा है! मुझे लगता है कि यह वही है जिसे टाइप सिस्टम सिद्धांत समुदाय में एक प्रतिच्छेदन प्रकार कहा जाता है। मैं जावा आप केवल कई सीमाओं के साथ प्रकार मापदंडों के लिए इस तरह के हो सकते हैं। यह पत्र उन्हें जावा में प्रथम श्रेणी के प्रकार के रूप में पेश करने का सुझाव देता है, साथ ही उन्हें निरूपित करने के लिए वाक्यविन्यास।
Lii

7
अच्छा सारांश। कुछ और महत्वपूर्ण विशेषताएं: स्विफ्ट प्रोटोकॉल संबद्ध प्रकार की आवश्यकताओं को भी निर्दिष्ट कर सकते हैं - जैसे एक संग्रह प्रकार में एक संबंधित सूचकांक प्रकार होता है, या एक तुलनीय प्रकार की तुलना के तरीकों के लिए उसी प्रकार के पैरामीटर की आवश्यकता होती है। और स्विफ्ट 2.0 में, प्रोटोकॉल एक्सटेंशन वास्तविक कार्यक्षमता को उन प्रकारों में जोड़ सकते हैं जो प्रोटोकॉल की आवश्यकताओं को पूरा करते हैं।
रिकस्टर

2
@rickster जावा 8 भी default कीवर्ड के साथ एक विधि को टैग करके इंटरफ़ेस में कार्यान्वयन जोड़ सकता है । ओरेकल ट्यूटोरियल देखें ।
तुलसी बोर्के

5
प्रोटोकॉल <> कीवर्ड अब एम्परसेंड के पक्ष में हटा दिया गया है। तो आप लिख सकते हैं: let c: A & B
पॉल रॉबिन्सन

2
स्विफ्ट में, इंटरफेस के बजाय, प्रोटोकॉल नाम का उपयोग किया जाता है क्योंकि C से ऑब्जेक्टिव C हेडर फाइल (बेकार डुप्लिकेट) को इंटरफेस कहा जाता है
एलेक्स78191

33

@Thomas Schar के उत्तर को लागू करना। स्विफ्ट प्रोटोकॉल जादू विस्तार से आता है।

  • स्विफ्ट प्रोटोकॉल विस्तार (स्विफ्ट
    2) के माध्यम से कार्यान्वयन प्राप्त कर सकते हैं । जावा 8 इंटरफ़ेस में डिफ़ॉल्ट कार्यान्वयन हो सकते हैं, लेकिन इसे "पूर्वव्यापी रूप से नहीं किया जा सकता है।"
  • स्विफ्ट में, आप
    किसी भी वर्ग या संरचना में प्रोटोकॉल आवश्यकताओं (और यदि आवश्यक हो तो इसके कार्यान्वयन) को जोड़ सकते हैं ।
  • स्विफ्ट प्रोटोकॉल जेनेरिक (यानी <..>) अनुकूलन पैटर्न का पालन नहीं करते हैं, लेकिन एक टाइपेलियास स्कीम (यानी एसोसिएटेड प्रकार)। शुरुआत में भ्रमित हो सकते हैं, लेकिन
    कुछ मामलों में "कोण ब्रैकेट अंधापन" से बच सकते हैं।
  • स्विफ्ट में एक उन्नत प्रकार का पैटर्न मिलान है, जहां प्रोटोकॉल आवश्यकताओं और एक्सटेंशन को लागू करने के लिए बहुत विशिष्ट होने की अनुमति मिलती है। जावा से आने पर यह भ्रमित हो सकता है, लेकिन इसमें बहुत शक्ति है।
  • एक स्विफ्ट प्रोटोकॉल एक संपत्ति / परम (यानी उत्सवकर्ता: प्रोटोकॉल) के लिए बनाया जा सकता है

एक बात जो मुझे कुछ घंटों के लिए अपने सिर को खरोंचने के लिए मिली, वह यह है कि सभी प्रोटोकॉल का उपयोग संपत्ति के प्रकार के रूप में नहीं किया जा सकता है। उदाहरण के लिए, यदि आपके पास टाइपेलियास के साथ एक प्रोटोकॉल है, तो आप इसे सीधे एक प्रकार की संपत्ति के रूप में उपयोग नहीं कर सकते हैं (जब आप इसके बारे में सोचते हैं तो यह समझ में आता है, लेकिन जावा से हम वास्तव में उपयोगकर्ताडॉ: आईडीओ जैसी संपत्ति चाहते हैं)।


7
जावा इंटरफेस के विपरीत स्विफ्ट प्रोटोकॉल में वैकल्पिक सदस्य हो सकते हैं।
eyeApps LLC

4
एक छोटी सी बात जो हमेशा स्विफ्ट में आती है, वह है (हास्यास्पद) कोई अमूर्त कार्य नहीं है, इसलिए आप बस "प्रिंट करें आप इसे भूल गए!" ... stackoverflow.com/a/24111430/294884
फेटी

@Fattie। आप एक फ़ंक्शन पर "आवश्यक" कीवर्ड का उपयोग कर सकते हैं यह निर्दिष्ट करने के लिए कि इसे एक उपवर्ग कार्यान्वयन की आवश्यकता है। तो वास्तव में, एक वास्तविक बिंदु की तुलना में मामूली अज्ञानता की तरह।
डिर्क बेस्टर

@DirkBester - चीयर्स - रुको, आप शुरुआती लोगों के साथ बात कर रहे हैं ??
फटी

फिर से @DirkBester में मुझे कुछ भ्रम हो सकता है, लेकिन एक requiredप्रोटोकॉल में एक समारोह से पहले उपयोग नहीं किया जा सकता है, आपको बस मिल जाएगा 'required' may only be used on 'init' declarations...
Fattie
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.