स्विफ्ट आसानी से बाहरी, आंतरिक संपत्ति को फिर से लिखना


103

स्विफ्ट में, सामान्य पैटर्न को परिभाषित करने का पारंपरिक तरीका क्या है जहां एक संपत्ति को बाहरी रूप से आसानी से पढ़ा जा सकता है, लेकिन वर्ग द्वारा आंतरिक रूप से परिवर्तनीय (और उपवर्ग) जो इसका मालिक है।

उद्देश्य-सी में, निम्नलिखित विकल्प हैं:

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

जावा में सम्मेलन है:

  • एक संरक्षित क्षेत्र घोषित करें, और एक सार्वजनिक, केवल-पठन करने वाले (विधि) को लागू करें।

स्विफ्ट के लिए मुहावरा क्या है?

जवाबों:


219

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

private(set) public var readonlyProperty: Int

सुझाव पढ़ने: गेटर्स और सेटर्स

पहुँच स्तर के बारे में मार्टिन के विचार अभी भी मान्य हैं - अर्थात कोई protectedसंशोधक नहीं है , internalकेवल privateवर्तमान फ़ाइल तक, और publicबिना किसी प्रतिबंध के केवल मॉड्यूल तक पहुँच को प्रतिबंधित करता है।

3 नोट स्विफ्ट करें

2 नए पहुँच संशोधक, fileprivateऔर open, भाषा में जोड़ा गया है, जबकि privateऔर publicथोड़ा संशोधित किया गया है:

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

  • privateअब एक सदस्य को केवल संलग्न घोषणा से दृश्यमान और सुलभ बनाता है, जबकि fileprivateपूरी फ़ाइल में जहां यह निहित है

अधिक जानकारी यहाँ


अच्छा! (मैंने varइसे संकलित करने के लिए लापता कीवर्ड को जोड़ने की स्वतंत्रता ली है ।)
मार्टिन आर।

ओह बहुत बहुत धन्यवाद :) मैं आमतौर पर खेल के मैदान और पेस्ट से कॉपी करता हूं, लेकिन इस बार मैंने शायद यह गलत किया है।
एंटोनियो

10
जनवरी -2015 के रूप में ध्यान दें कि यह वाक्यविन्यास बिल्कुल सही नहीं है यदि बाहरी वर्ग नहीं है public- यह बिल्कुल internalभी होना चाहिए या कुछ भी नहीं होना चाहिए (जो भी वर्ग के लिए चूक है - publicया internal) - यानीprivate(set) var readonlyProperty: Int
ग्रिमैक्स

1
अच्छी तरह से वाक्यविन्यास सही है कि कोड से ठीक पहले मैंने एक सार्वजनिक संपत्ति और एक निजी सेटर के साथ एक वर्ग संपत्ति लिखी - यह सिर्फ एक उदाहरण है। लेकिन हाँ, गुणों के लिए एक्सेस संशोधक वर्ग / संरचना एक्सेस संशोधक के साथ "संगत" होना चाहिए।
एंटोनियो

अंतिम पैराग्राफ के बारे में, मुझे लगता है कि उत्तर लिखे जाने के बाद से यह बदल गया है, लेकिन privateअब वर्तमान घोषणा (फ़ाइल नहीं) के fileprivateलिए प्रतिबंधित है और वर्तमान फ़ाइल पर प्रतिबंध लगाने के लिए उपलब्ध है। इसके अलावा publicकुछ प्रतिबंध होते हैं और openकोई प्रतिबंध के लिए आवश्यक है। विवरण यहाँ है
निगेल बी। पेक

2

@Antonio के अनुसार, हम readOnlyसार्वजनिक और readWriteनिजी रूप से संपत्ति के मूल्य के रूप में उपयोग करने के लिए एकल संपत्ति का उपयोग कर सकते हैं । नीचे मेरा चित्रण है:

class MyClass {

    private(set) public var publicReadOnly: Int = 10

    //as below, we can modify the value within same class which is private access
    func increment() {
        publicReadOnly += 1
    }

    func decrement() {
        publicReadOnly -= 1
    }
}

let object = MyClass()
print("Initial  valule: \(object.publicReadOnly)")

//For below line we get the compile error saying : "Left side of mutating operator isn't mutable: 'publicReadOnly' setter is inaccessible"
//object.publicReadOnly += 1

object.increment()
print("After increment method call: \(object.publicReadOnly)")

object.decrement()
print("After decrement method call: \(object.publicReadOnly)")

और यहाँ उत्पादन है:

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