प्रारंभिक मूल्य वाले निजी गुणों को अभी भी init कन्स्ट्रक्टर की आवश्यकता क्यों है (भले ही यह इसके लिए कुछ भी नहीं करता)?

struct Person {
    private var middle: String = "A"

    var first: String
    var last: String
    
    init(first: String, last: String) {
        self.first = first
        self.last = last
    }

    func printName() {
        print("\(first) \(middle). \(last)")
    }
}

let someone = Person(first: "", last: "")
someone.printName()

यह सिर्फ मुझे टूटा हुआ लगता है क्योंकि अगर मैं निजी एक्सेसर को हटा देता हूं तो यह ठीक है। मुझे यकीन है कि इस व्यवहार की व्याख्या करने के लिए कुछ है और मैं बस उत्सुक हूं कि यह क्या है।

-1
dniswhite 1 नवम्बर 2020, 23:03

2 जवाब

सबसे बढ़िया उत्तर

यदि आप स्पष्ट रूप से प्रारंभकर्ता को छोड़ देते हैं, तो यह एक सदस्य-वार प्रारंभकर्ता उत्पन्न करता है, init(middle:first:last:) (जहां middle का डिफ़ॉल्ट मान होता है), लेकिन क्योंकि middle private है, इसलिए यह है प्रारंभकर्ता।

जैसा कि दस्तावेज़ीकरण कहता है:

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

यदि middle को एक चर के रूप में चिह्नित नहीं किया गया था जिसे सेट किया जा सकता था (या तो इसे private let के साथ स्थिर बनाकर या केवल सेटर को निजी होने के लिए सेट करके (private(set) var के साथ, तब केवल init(first:last:) आपकी ओर से बनाया जाएगा।

4
Rob 2 नवम्बर 2020, 10:32

डिफ़ॉल्ट सदस्य-वार प्रारंभकर्ता निजी हो जाता है जब मध्य नाम को निजी रूप से संरक्षित किया जाता है, क्योंकि इसमें संग्रहीत संपत्ति होती है क्योंकि Apple डॉक्स "आप इनिशियलाइज़ेशन के दौरान किसी संग्रहित प्रॉपर्टी के लिए प्रारंभिक मान सेट और संशोधित भी कर सकते हैं"

चूंकि मध्य नाम एक var है, इसे अभी भी आरंभीकरण के दौरान संशोधित किया जा सकता है, भले ही यह एक संग्रहीत संपत्ति है। इस प्रकार डिफ़ॉल्ट सदस्यवार प्रारंभकर्ता निजी हो जाता है।

2
Pratheesh Bennet 2 नवम्बर 2020, 19:06