मैं स्विफ्ट में स्ट्रक्चर्स के लिए, डिफ़ॉल्ट रूप से, सदस्यवार इनिशिएटिव को सार्वजनिक कैसे कर सकता हूं?


164

मेरे पास एक स्विफ्ट ढांचा है जो एक संरचना को परिभाषित करता है:

public struct CollectionTO {
    var index: Order
    var title: String
    var description: String
}

हालाँकि, मैं लाइब्रेरी को आयात करने वाले किसी अन्य प्रोजेक्ट से अंतर्निहित सदस्य वार इनिशियलाइज़र का उपयोग नहीं कर सकता। त्रुटि है 'CollectionTO' को प्रारंभ नहीं किया जा सकता है क्योंकि इसमें कोई पहुँच योग्य आरंभकर्ता नहीं हैं। यानी यह डिफ़ॉल्ट अंतर्निहित सदस्य वार इनिशियलाइज़र को सार्वजनिक कीवर्ड नहीं दे रहा है।

var collection1 = CollectionTO(index: 1, title: "New Releases", description: "All the new releases")

मुझे अपनी खुद की init विधि को इस तरह जोड़ना है:

public struct CollectionTO {
    var index: Order
    var title: String
    var description: String

    public init(index: Order, title: String, description: String) {
        self.index = index;
        self.title = title;
        self.description = description;
    }

}

... लेकिन मैं नहीं बल्कि अगर कोई और तरीका है कोई जानता है?

जवाबों:


269

मैनुअल का हवाला देते हुए:

"संरचना के प्रकारों के लिए डिफ़ॉल्ट सदस्यवार प्रारंभकर्ता। संरचना के प्रकार के लिए डिफ़ॉल्ट सदस्यवार प्रारंभ करनेवाला निजी माना जाता है यदि संरचना के किसी भी संग्रहीत गुण निजी हैं। अन्यथा, प्रारंभ करनेवाला के पास आंतरिक का एक पहुंच स्तर है।

ऊपर के डिफॉल्ट इनिशलाइज़र के साथ की तरह, यदि आप चाहते हैं कि पब्लिक स्ट्रक्चर टाइप किसी अन्य मॉड्यूल में इस्तेमाल होने पर मेंबरवाइज़ इनिशियलाइज़र के साथ इनिशियलाइज़ हो, तो आपको टाइप के डेफिनेशन के हिस्से के रूप में खुद को पब्लिक मेंबर इनिशियलाइज़र प्रदान करना होगा। "

"द स्विफ्ट प्रोग्रामिंग लैंग्वेज" , सेक्शन "एक्सेस कंट्रोल" का अंश ।


289
खैर, यह कष्टप्रद है। :(
दान लोवेनहर्ज

7
[ Github.com/apple/swift-evolution/blob/master/proposals/... कहते हैं: "क्रिस लैटनर का हवाला देते हुए: स्विफ्ट के व्यवहार प्रारंभकर्ता डिफ़ॉल्ट सदस्य वार है कम से कम इन तत्वों की कमी (IMO): 2) अभिगम नियंत्रण + सदस्य वार अक्सर init आपको इसे स्वयं लागू करने की आवश्यकता है ”। तो शायद यह सिर्फ एक कमी है जो विशेष रूप से बिना किसी कारण के मौजूद है। इसके बारे में अधिक संदर्भ नहीं मिल सका।
जानो

8
@DanLoewenherz हाँ यह असुविधाजनक है। औचित्य यह है: “एक सार्वजनिक प्रकार के आंतरिक सदस्य होने के लिए चूक होती है, सार्वजनिक सदस्य नहीं। यदि आप चाहते हैं कि एक प्रकार का सदस्य सार्वजनिक हो, तो आपको इसे स्पष्ट रूप से चिह्नित करना चाहिए। यह आवश्यकता सुनिश्चित करती है कि एक प्रकार के लिए सार्वजनिक-सामना करने वाला एपीआई कुछ ऐसा है जिसे आप प्रकाशन के लिए चुनते हैं, और गलती से सार्वजनिक एपीआई के रूप में एक प्रकार के आंतरिक कामकाज को पेश करने से बचते हैं। " इसके अंश: Apple Inc. "स्विफ्ट प्रोग्रामिंग लैंग्वेज।" iBooks। itun.es/gb/jEUH0.l
bandejapaisa

18
एक संकलक निर्देश डिफ़ॉल्ट व्यवहार को ओवरराइड करने और इसे सार्वजनिक करने के लिए अच्छा होगा।
बंदगीजैसा

9
आंतरिक एक डिफ़ॉल्ट, इमो के लिए एक भयानक विकल्प है। यह मूल रूप से गारंटी देता है कि आप पहली बार एक मॉड्यूल को संदर्भित करते समय अप्रत्याशित समस्याओं में चलेंगे। क्यों न सब कुछ निजी रूप से तय किया जाए, ताकि हम तुरंत बता सकें कि किसी चीज़ को सही एक्सेस स्तर नहीं दिया गया है और फिर यह तय करें कि क्या यह सार्वजनिक या आंतरिक होना चाहिए?
devios1

72

हालांकि यह डिफ़ॉल्ट सदस्य प्रारंभ करनेवाला के लिए कम से कम संभव नहीं है, आप निम्न चरणों के साथ जल्दी से एक बना सकते हैं:

  1. ऑब्जेक्ट को किसी संरचना के बजाय अस्थायी रूप से एक वर्ग बनाएं
  2. सहेजें
  3. क्लास के नाम पर राइट क्लिक करें और रिफ्लेक्टर चुनें -> सदस्यवार आरंभक जनरेट करें
  4. इसे वापस एक संरचना में बदलें

प्रतिभाशाली। इस तेजी से कमी के आसपास काम करने के लिए आपको धन्यवाद नहीं दे सकता
एंटोन ट्रोपास्को

1
वर्क्स और वास्तव में स्ट्रक्चर्स के बजाय कक्षाओं का उपयोग करने के लिए प्रेरित करता है youtube.com/watch?v=_V2sBURgUBI
इसहाक कैरोल वीसबर्ग

यह एक सुपर टिप है !!
पयमनख

6
Xcode 11 के अनुसार, आप जेनेरेट मेम्बरवाइज़ इनिशियलाइज़र को स्ट्रक्चर्स पर भी इस्तेमाल कर सकते हैं!
ब्रॉक बॅटसेल

बहुत खुबस!!! यह सही उत्तर नहीं है, लेकिन एक बहुत अच्छा टिप है! मेरी बहुत मदद की!
गियोस

3

जब तक Apple इसे बदल नहीं देता और इसे कम कष्टप्रद नहीं बना देता, तब तक आप https://github.com/Bouke/SwiftInitializerGenerator (या कोई भी) सार्वजनिक इनिशियलाइज़र निर्माण के लिए इस चीज़ का उपयोग कर सकते हैं । तो यह कम काम होगा। कोशिश की और यह काम करता है। Xcode संस्करण 10.0, उच्च सिएरा 10.13.6


1

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

इस रत्न को स्विफ्ट_रेप रिपब्लिक कहा जाता है

कृपया इस रत्न को चलाने के लिए निम्नलिखित दस्तावेज देखें:

https://github.com/mehul90/swift_republic


1
बहुत बढ़िया समाधान !! मैंने पहले से ही swift_republicठीक काम करने के लिए एक रैपर बनाया है।
एमडी शाहिद हुसैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.