2015-04-15 12 views
10

के साथ वैकल्पिक का उपयोग मैं तेजी से सीख रहा हूं। पहली छाप पर मैं और उदाहरणस्विफ्ट -

let userName: String? 

के लिए (एक प्रारंभिक संग्रहीत मूल्य के बिना) एक निरंतर घोषित करने एक वर्ग के भीतर एक वैकल्पिक के रूप में के किसी भी बिंदु को देखने नहीं कर सकते ... क्योंकि एक डिफ़ॉल्ट प्रारंभकर्ता शून्य को असाइन होता यह wouldn ' बाद में परिवर्तित नहीं किया जा सकता है (क्योंकि यह स्थिर है)।

मैं यह समझ के रूप में, एक कस्टम प्रारंभकर्ता अभी भी एक गैर शून्य मूल्य इसे करने के लिए (यानी गैर वैकल्पिक) प्रदान कर सकते हैं लेकिन इस मामले में आप सिर्फ let userName: String के रूप में यह घोषणा नहीं करेंगे

मैं उम्मीद है कि अगर यह एक अनावश्यक पैटर्न था कि सेब ने इसका जिक्र किया होगा लेकिन मैं नहीं देख सकता कि उनके पास .... तो किस स्थिति में वैकल्पिक निरंतर घोषणा का उपयोग किया जाएगा या उपयोगी होगा?

+0

मान लीजिए फेंक दिया जाएगा आपके पास एक ऐप है जहां उपयोगकर्ता ईमेल के माध्यम से साइन अप करते हैं, और वे _optionally_ उपयोगकर्ता नाम दर्ज कर सकते हैं। और आप जानकारी के दोनों टुकड़े अगले नियंत्रक को पास करना चाहते हैं। अगला नियंत्रक जानता है कि इनमें से कोई भी मूल्य कभी भी अपने जीवनकाल में नहीं बदलेगा, लेकिन उपयोगकर्ता नाम वैकल्पिक है। इस प्रकार, आप इसे 'स्ट्रिंग' घोषित करते हैं? – Connor

उत्तर

15

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

कहें कि आपके पास एक वर्ग है जो नेटवर्क अनुरोध से प्रतिक्रिया डेटा से भरा हो जाता है। आपके द्वारा वापस आने वाले कुछ फ़ील्ड शून्य हो सकते हैं, या उनमें डेटा हो सकता है।

आप कोड लिखते हैं जो सर्वर से प्रतिक्रिया को पार करता है और प्रतिक्रिया ऑब्जेक्ट बनाता है। प्रतिक्रिया वस्तु की प्रत्येक संपत्ति तय की गई है। यदि आपको उस संपत्ति के लिए जानकारी मिलती है, या शून्य में डेटा शामिल होता है।

उस स्थिति में यह वैकल्पिक निरंतर उपयोग करने के लिए सही समझ में आता है।

आप अपनी प्रतिक्रिया ऑब्जेक्ट के लिए एक इनिट विधि लिखेंगे जो नेटवर्क उत्तर लेगा (उदाहरण के लिए JSON में) और प्रतिक्रिया ऑब्जेक्ट के गुणों को भरें। यदि JSON डेटा में दिया गया टैग गुम है, तो आप उस प्रॉपर्टी को शून्य पर सेट करेंगे। आप निरंतर उपयोग करते हैं क्योंकि प्रतिक्रिया ऑब्जेक्ट प्रारंभ होने के बाद मान तय किया जाता है। यदि यह शून्य है, तो यह हमेशा के लिए शून्य होगा। यदि इसमें कोई मान है, तो इसमें हमेशा वह मान होगा और इसे बदला नहीं जा सकता है।

3

आप एक शाब्दिक डाल रहे हैं और आप इसे वैकल्पिक करते हैं, तो वैकल्पिक हिस्सा बेकार है क्योंकि आप जानते हैं कि number1

let number: Int? = 1 

होने के लिए लेकिन, आप की एक निरंतर प्रतिलिपि बनाना चाहते हैं तो जा रहा है है एक और वस्तु, जहां आप नहीं जानते कि स्रोत शून्य होने वाला है या नहीं, यह है।

var array = ["hello"] 
let string: String? = array[1] 

// string is nil, so you can do some checking with it 

ऊपर के उदाहरण काफी मेरी बात को वर्णन नहीं है, लेकिन लगता है कि array एक परिवर्तनशील सरणी है जो आप को दूर किया जा सकता है और कहीं-कहीं मानों को जोड़ने है (जहाँ आप एक नहीं के बराबर मूल्य मिल सकता है आप के लिए जाँच कर रहे हैं, तो " 1 "सूचकांक)

+2

एक बेहतर उदाहरण होगा 'स्ट्रिंग दें: स्ट्रिंग? = array.first'। अभिव्यक्ति 'सरणी [1] 'क्रैश हो जाएगी यदि सरणी में 2 ऑब्जेक्ट्स नहीं हैं, जहां' array.first' एक वैकल्पिक विकल्प देता है जिसमें सरणी खाली है तो शून्य होता है। –

1

केवल वैकल्पिक चर स्वचालित रूप से शून्य पर सेट हो जाएगा अगर कोई प्रारंभिक मान प्रकार टी के


वैकल्पिक निरंतर प्रदान की?नहीं स्वचालित रूप से "initialised किए जाने से पहले लगातार पुराना" शून्य
इसे मैन्युअल रूप से या नहीं के बराबर

  • प्रकार टी के एक मूल्य के साथ initialised किए जाने की आवश्यकता पर सेट हो जाएगा, तो इसे मैन्युअल रूप से पहले इस्तेमाल किया, एक त्रुटि initialised नहीं है हो जाएगा

    फेंक दिया
  • इसी प्रकार, यदि एक वर्ग है, स्पष्ट रूप से बिना एक वैकल्पिक निरंतर संपत्ति है मैन्युअल रूप से इसे initialising और यह भी कोई निर्माण, एक त्रुटि "वर्ग नहीं initialisers है" है