2016-08-14 14 views
233

मानक पुस्तकालय से ObjectiveC.swift फ़ाइल लाइन 228 के आसपास कोड की निम्न कुछ लाइनें शामिल हैं:स्विफ्ट में 'खुला' कीवर्ड क्या है?

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

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

उत्तर

406

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

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

संक्षेप में:

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

तो open क्या public पिछले स्विफ्ट विज्ञप्ति में हुआ करता था और public की पहुँच को प्रतिबंधित किया गया है। या, क्रिस लैटनर SE-0177: Allow distinguishing between public access and public overridability में यह कहते हैं:

"खुला" एक बहुत ही सरल और साफ मॉडल उपलब्ध कराने, बस "अधिक सार्वजनिक की तुलना में सार्वजनिक" अब है।

अपने उदाहरण में, open var hashValue एक संपत्ति जो सुलभ है और NSObject उपवर्गों में अधिरोहित जा सकता है।

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

+9

तो स्विफ्ट 3 में 'सार्वजनिक' स्विफ्ट 2 में 'सार्वजनिक फाइनल' की तरह है, और 'ओपन'' सार्वजनिक 'की तरह है? – Clashsoft

+14

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

+0

आह ठीक है, स्पष्टीकरण के लिए धन्यवाद। – Clashsoft

3

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

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

क्लासेस

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

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

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

इस अद्यतन

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

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

अधिक जानकारी के लिए एक open class func अपनी परियोजना में कहीं से भी पहुंचा जा सकता है, Apple Documentation on Access Control

2

उपवर्ग के अलावा पर नजर है। आप अपना दृश्य नियंत्रकों के कहीं भी में इस

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

की तरह अपने util कक्षा में एक खुले वर्ग समारोह को परिभाषित कर रहे तो कहो, तो आप बस बुला

Utils.printHello() 
+0

यह उत्तर यह नहीं बताता कि यह सार्वजनिक से अलग कैसे है क्योंकि आप इसे सार्वजनिक रूप से भी कर सकते हैं। –

+0

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

3

के रूप में खुला पढ़ें द्वारा इस पद्धति का उपयोग कर सकते

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

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

Apple Docs से

:

ओपन एक्सेस केवल वर्गों और वर्ग के सदस्यों पर लागू होता है, और यह इस प्रकार सार्वजनिक उपयोग से अलग है:

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

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

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

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