2015-12-20 10 views
35

मुझे var और कीवर्ड {0 सेट करें} के उपयोग के बारे में स्विफ्ट में प्रोटोकॉल के बारे में संदेह है।स्विफ्ट में प्रोटोकॉल में क्यों उपयोग नहीं कर सकता?

Apple documentation से

:

एक प्रोटोकॉल, प्राप्य और settable है कि संपत्ति आवश्यकता एक निरंतर संग्रहीत संपत्ति या केवल पढ़ने के लिए परिकलित प्रॉपर्टी द्वारा पूरा नहीं किया जा सकता एक संपत्ति की आवश्यकता है। यदि प्रोटोकॉल को केवल संपत्ति प्राप्त करने योग्य होने की आवश्यकता है, तो आवश्यकता किसी भी प्रकार की संपत्ति से संतुष्ट हो सकती है, और यह पर यह भी सेट करने योग्य है कि यह आपके कोड के लिए उपयोगी है।

संपत्ति आवश्यकताओं को हमेशा परिवर्तनीय गुणों के रूप में घोषित किया जाता है, विभिन्न कीवर्ड के साथ उपसर्ग। Gettable और settable गुण उनके प्रकार की घोषणा के बाद {get set} लिखकर इंगित किए गए हैं, और gettable गुणों को {get} लिखकर इंगित किया जाता है।

मुझे समझ में नहीं आ रहा है कि मैं का उपयोग क्यों नहीं कर सकताvar केवल के साथ प्रोटोकॉल में प्राप्त करें नहीं है?

कुछ इस तरह:

protocol someProtocol 
{ 
    var someProperty: String { get } 
} 

यह नहीं होगा बस:

protocol someProtocol 
{ 
    let someProperty: String 
} 

मैं कुछ याद कर रहा हूँ?

+4

एक गेटेबल संपत्ति अभी भी मूल्यों को बदल सकती है - प्रोटोकॉल कार्यान्वयनकर्ता हमेशा अलग-अलग मान वापस कर सकता है, प्रोटोकॉल कॉलर बस उन्हें सेट नहीं कर सकता है। दूसरी ओर, एक निरंतर परिभाषित करता है। इसे केवल एक बार सेट किया जा सकता है और इसका कोई अलग मूल्य नहीं हो सकता है। – pvg

+1

@pvg, आपने इसे उत्तर के रूप में क्यों पोस्ट नहीं किया? – courteouselk

+0

yup, यह सही जवाब है। – sunshinejr

उत्तर

35

"केवल एक प्रोटोकॉल में एक var केवल एक चलो नहीं है?" सं। let एक स्थिर इंगित करता है। लेकिन यह मामला यहां नहीं है। निम्नलिखित पर विचार करें:

protocol SomeProtocol { 
    var someProperty: String { get } 
} 

class SomeClass : SomeProtocol { 

    var someProperty: String = "" 

    func cla() { 
     someProperty = "asd" 
    } 
} 

let someInstance = SomeClass() 

print(someInstance.someProperty) // outputs "" 
someInstance.cla() 
print(someInstance.someProperty) // outputs "asd" 

प्रोटोकॉल निर्दिष्ट करता है क्या अनुरूप कक्षा के बाहर को दर्शाता है - प्रकार StringsomeProperty जो आप कर सकते हैं कम से कम प्राप्त नामित के कुछ संपत्ति।

यदि प्रोटोकॉल { get } निर्दिष्ट करता है तो आपकी कक्षा let someProperty: String = "" के माध्यम से अनुरूप हो सकती है लेकिन यह उपरोक्त कोड के माध्यम से समान रूप से अनुरूप हो सकती है। यदि दूसरी ओर प्रोटोकॉल { get set } निर्दिष्ट करता है तो आप कार्यान्वयन में let का उपयोग नहीं कर सकते हैं, लेकिन इसे सेट-सक्षम भी करना है।

एक प्रोटोकॉल बस परिभाषित नहीं कर सकता है कि एक मूल्य स्थिर होना चाहिए - न ही यह होना चाहिए, यह एक कार्यान्वयन विवरण है जिसे कक्षा/संरचना द्वारा देखभाल (या निर्णय लिया जाना) है जो इसे लागू करता है।

+0

वापस देखकर यह इतना आसान और स्पष्ट था, प्रोटोकॉल में केवल फ़ंक्शंस (फिर गुण) की अनुमति है, लेकिन मैं हमेशा पूछना पसंद करता हूं और किसी भी संदेह को हल करता हूं; अब '{get set} 'का उपयोग हमेशा के रूप में स्पष्ट है, फिर से धन्यवाद! –

21

अंतर

के बीच

protocol MyProtocol { 
    let someProperty: String 
} 
जो कोई मतलब नहीं है - एक प्रोटोकॉल हुक्म को someProperty कैसे परिभाषित किया गया है/संग्रहीत, केवल कि यह एक संपत्ति के रूप में उपलब्ध है चाहिए नहीं है। यह या तो एक गणना या संग्रहीत संपत्ति हो सकती है, लेकिन यह कार्यान्वयनकर्ता के लिए है, न कि प्रोटोकॉल स्वयं।

और

protocol MyProtocol { 
    var someProperty: String { get } // abstract interface 
} 

struct MyStruct: MyProtocol { 
    let someProperty: String // concrete implementation: stored property 
} 

struct OtherStruct: MyProtocol { 
    let i: Int 
    var someProperty: String { return "\(i)" } // concrete implementation: computed property 
} 

जो पूरी तरह से अनुमति दी है!

संबंधित मुद्दे