स्विफ्ट में 'ओपन ’कीवर्ड क्या है?


334

ObjectiveC.swiftमानक लाइब्रेरी की फ़ाइल में लाइन 228 के आसपास कोड की कुछ पंक्तियाँ हैं:

extension NSObject : Equatable, Hashable {
  /// ...
  open var hashValue: Int {
    return hash
  }
}

open varइस संदर्भ में क्या मतलब है, या openसामान्य रूप से कीवर्ड क्या है ?


2
संभवतः संबंधित: stackoverflow.com/questions/24003918/… ("क्या अंतर है openऔर public?")
अहमद एफ

साइड नोट: कीवर्ड "ओपन" अवधारणा से आया था "विस्तार के लिए खुला, संशोधन के लिए बंद"
सज्जाद हिसैन खान

जवाबों:


572

open स्विफ्ट 3 में एक नया एक्सेस स्तर है, जिसे लागू करने के साथ पेश किया गया है

यह स्विफ्ट 3 स्नैपशॉट के साथ 7 अगस्त 2016 से उपलब्ध है, और Xcode 8 बीटा 6 के साथ है।

संक्षेप में:

  • डिफाइनिंग मॉड्यूल के बाहर एक openवर्ग सुलभ और सुस्पष्ट है । एक openवर्ग के सदस्य है सुलभ और overridable को परिभाषित मॉड्यूल के बाहर।
  • एक publicवर्ग सुलभ है, लेकिन परिभाषित मॉड्यूल के बाहर पहुंच योग्य नहीं है । परिभाषित मॉड्यूल के बाहर एक publicवर्ग का सदस्य पहुंच योग्य नहीं बल्कि सुलभ है

तो openक्या publicपिछले स्विफ्ट रिलीज में इस्तेमाल किया गया है और इसकी पहुंच publicप्रतिबंधित है। या, जैसा कि क्रिस लैटनर ने SE-0177 में रखा है: सार्वजनिक पहुंच और सार्वजनिक अति-अक्षमता के बीच अंतर करने की अनुमति दें :

"खुला" अब बहुत सरल और स्वच्छ मॉडल प्रदान करता है, बस "सार्वजनिक से अधिक सार्वजनिक" है।

आपके उदाहरण में, open var hashValueएक संपत्ति है जो सुलभ है और NSObjectउपवर्गों में ओवरराइड की जा सकती है ।

अधिक उदाहरणों और विवरणों के लिए, SE-0117 पर एक नज़र डालें ।


16
तो publicस्विफ्ट 3 में स्विफ्ट 2 की तरह public finalहै, और openजैसा है public?
क्लेशॉफ्ट

16
@Clashsoft: "खुला" स्विफ्ट 3 में स्विफ्ट 2 में की तरह "सार्वजनिक" है "सार्वजनिक" स्विफ्ट 3 में स्विफ्ट 2 में कोई समकक्ष है (एक अंतिम वर्ग बिल्कुल भी नहीं एक ही मॉड्यूल में subclassed नहीं किया जा सकता।)
मार्टिन आर

59
यह प्रफुल्लित करने वाला है। सारांश के लिए धन्यवाद।
गोल्डनजॉए

7
@ मायके से सहमत हैं, और पिछड़ी अनुकूलता की कमी इसे एक भयानक गड़बड़ बनाती है।
ह्यूघघटोटेल

14
@ माइक सेब - अलग-अलग सोचें, भले ही यह अनावश्यक हो।
वरुण नाथ

12

के रूप में खुला पढ़ें

अन्य मॉड्यूल में विरासत के लिए खुला है

मैं अन्य मॉड्यूल में विरासत के लिए खुला दोहराता हूं। तो एक खुला वर्ग अन्य मॉड्यूल में उपवर्ग के लिए खुला है जिसमें परिभाषित मॉड्यूल शामिल है। अन्य मॉड्यूल में ओवरराइडिंग के लिए ओपन वर्जन और फंक्शन खुले हैं। इसका कम से कम प्रतिबंधक पहुंच स्तर है। यह उतना ही अच्छा है जितना कि सार्वजनिक पहुंच यह स्वीकार करती है कि जो कुछ सार्वजनिक है वह अन्य मॉड्यूल में विरासत के लिए बंद है।

से एप्पल डॉक्स :

ओपन एक्सेस केवल कक्षाओं और वर्ग के सदस्यों पर लागू होता है, और यह सार्वजनिक पहुंच से भिन्न होता है:

  1. सार्वजनिक पहुंच या किसी भी अधिक प्रतिबंधक पहुंच स्तर वाली कक्षाएं, केवल उस मॉड्यूल के भीतर उप-वर्गित की जा सकती हैं, जहां वे परिभाषित हैं।

  2. सार्वजनिक पहुंच, या किसी भी अधिक प्रतिबंधात्मक पहुंच स्तर वाले वर्ग के सदस्यों को केवल उन मॉड्यूल के भीतर उप-वर्ग द्वारा ओवरराइड किया जा सकता है, जहां वे परिभाषित हैं।

  3. खुले वर्गों को उस मॉड्यूल के भीतर उप-वर्गित किया जा सकता है जहां वे परिभाषित हैं, और किसी भी मॉड्यूल के भीतर मॉड्यूल को आयात करते हैं जहां वे परिभाषित हैं।

  4. खुले वर्ग के सदस्यों को मॉड्यूल में उपवर्गों द्वारा ओवरराइड किया जा सकता है जहां वे परिभाषित हैं, और किसी भी मॉड्यूल के भीतर मॉड्यूल को आयात करते हैं जहां वे परिभाषित हैं।

5

ओपन एक एक्सेस लेवल है, जिसे स्विफ्ट पर क्लास इनहेरिटेंस पर लिमिट्स लगाने के लिए पेश किया गया था।

इसका मतलब है कि ओपन एक्सेस स्तर केवल कक्षाओं और कक्षा के सदस्यों के लिए लागू किया जा सकता है ।

कक्षाओं में

एक खुले वर्ग को उस मॉड्यूल में उप-वर्गित किया जा सकता है जिसे उस मॉड्यूल में परिभाषित किया गया है और उस मॉड्यूल को आयात करता है जिसमें कक्षा को परिभाषित किया गया है।

कक्षा सदस्यों में

यही बात कक्षा के सदस्यों पर लागू होती है। मॉड्यूल में उपवर्गों द्वारा एक खुली विधि को ओवरराइड किया जा सकता है और इसे मॉड्यूल में आयात किया जाता है जिसमें मॉड्यूल को परिभाषित किया जाता है।

इस अद्यतन के लिए आवश्यक है

पुस्तकालयों और चौखटों के कुछ वर्गों को उपवर्ग के रूप में डिजाइन नहीं किया गया है और ऐसा करने से अप्रत्याशित व्यवहार हो सकता है। मूल Apple लाइब्रेरी भी समान विधियों और कक्षाओं को ओवरराइड करने की अनुमति नहीं देगी,

इसलिए इस जोड़ के बाद वे अपने अनुसार सार्वजनिक और निजी पहुँच स्तर लागू करेंगे।

अधिक जानकारी के लिए एक्सेस कंट्रोल पर Apple डॉक्यूमेंटेशन देखें


1

उपवर्ग को छोड़कर, open class funcआपकी परियोजना में कहीं से भी सुलभ है। कहते हैं कि आप इस तरह अपने Util वर्ग में एक खुले वर्ग समारोह को परिभाषित कर रहे हैं

open class Utils: NSObject {
    open class func printHello() {
        print("Hello from utils")
    }
}

फिर अपने व्यू कंट्रोलर्स में कहीं भी कॉल करके आप इस तरीके को एक्सेस कर सकते हैं

Utils.printHello()

3
यह उत्तर स्पष्ट नहीं करता है कि यह जनता से अलग कैसे है क्योंकि आप ऐसा सार्वजनिक रूप से भी कर सकते हैं।
जोस रामिरेज़

इसके बारे में कुछ और स्पष्टीकरण की आवश्यकता है
एमडी असलम अंसारी

1

कई मॉड्यूल के साथ काम करते समय खुला खेलना आता है।

ओपनिंग क्लास डिफाइनिंग मॉड्यूल के बाहर पहुंच योग्य और उप-सुलभ है। एक खुले वर्ग का सदस्य डिफाइनिंग मॉड्यूल के बाहर पहुंच योग्य और अधिक उपयोग योग्य है।


0

खुला केवल उदाहरण के लिए एक और मॉड्यूल के लिए है: कोको फली, या इकाई परीक्षण, हम विरासत या ओवरराइड कर सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.