स्विफ्ट 101 - स्विफ्ट के नए वैकल्पिक मूल्यों के साथ काम करना

स्विफ्ट प्रोग्रामिंग भाषा में एक नई सुविधा है जिसे वैकल्पिक कहा जाता है जो पहले उद्देश्य-सी में उपलब्ध नहीं थे। वे जावा में वैकल्पिक प्रकार और C # प्रोग्रामिंग भाषा में अशक्त प्रकार के समान हैं।

वैकल्पिक का उपयोग क्यों करें?

आप सोच रहे होंगे "मैं वैकल्पिक को अनदेखा कर सकता हूं - यह एक ऐसी सुविधा है जिसका मैं कभी उपयोग नहीं करूंगा, " लेकिन मेरा सुझाव है कि आप आगे पढ़ें। आप पाएंगे कि स्विफ्ट में आपको वैकल्पिक का उपयोग करना होगा यदि आपको कभी भी शून्य होने की आवश्यकता हो!

स्विफ्ट में वैकल्पिक मान आपके कोड में आपको अधिक सटीक होने की अनुमति देता है जब आप निर्दिष्ट करते हैं कि किसी विशेष मूल्य के लिए ठीक है (और जब यह नहीं है!) इससे आपको अपने ऐप में होने वाली सामान्य प्रोग्रामिंग त्रुटियों से बचने में मदद मिलती है जब यह सामना करती है! अप्रत्याशित शून्य मान।

स्विफ्ट के विकल्प भी आपके ऐप के कोड को और अधिक बारीकी से देखने में मदद करते हैं जो आपके पास कोर डेटा में पहले से मौजूद क्षमता को इंगित करने के लिए है कि एक विशेष इकाई विशेषता वैकल्पिक है। जैसा कि चित्र 1 में दिखाया गया है, आप एक विशेषता के प्रकार (स्ट्रिंग, इस मामले में) को निर्दिष्ट कर सकते हैं और साथ ही संकेत दे सकते हैं कि मान वैकल्पिक है।

चित्र 1 - आप निर्दिष्ट कर सकते हैं कि एक कोर डेटा इकाई विशेषता वैकल्पिक है।

अब स्विफ्ट आपको अपने गुणों और चर के साथ ऐसा करने की अनुमति देता है। यहाँ स्विफ्ट में एक समान वैकल्पिक घोषणा है:

var middleName: String?

यह घोषणापत्र स्ट्रिंग के मध्य नाम का एक चर बनाता है। स्ट्रिंग चर प्रकार के बाद प्रश्न चिह्न ( ? ) इंगित करता है कि मध्यनाम चर में एक मान हो सकता है जो या तो स्ट्रिंग या शून्य हो सकता है। इस कोड को देखने वाला कोई भी व्यक्ति तुरंत जानता है कि मध्यनाम शून्य हो सकता है। यह स्व-दस्तावेजीकरण है!

यदि आप एक वैकल्पिक स्थिर या चर के लिए एक प्रारंभिक मान निर्दिष्ट नहीं करते हैं (जैसा कि ऊपर दिखाया गया है) तो मान स्वतः ही आपके लिए शून्य पर सेट हो जाता है। यदि आप पसंद करते हैं, तो आप स्पष्ट रूप से प्रारंभिक मूल्य को शून्य पर सेट कर सकते हैं:

var middleName: String? = nil

अब स्विफ्ट में निल का उपयोग कैसे किया जाता है, इस पर करीब से नज़र डालते हैं।

स्विफ्ट में एनआईएल

यह पहली नज़र में स्पष्ट नहीं हो सकता है, लेकिन केवल वैकल्पिक शून्य हो सकते हैं । जैसा कि Apple की द स्विफ्ट प्रोग्रामिंग लैंग्वेज बुक (iBooks Store में मुफ्त में उपलब्ध है):

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

इसका मतलब है कि आप ऐसा कुछ नहीं कर सकते हैं, क्योंकि फर्स्टनाम वेरिएबल को एक प्रश्न चिह्न के साथ चिह्नित नहीं किया गया है ताकि यह इंगित किया जा सके कि यह एक वैकल्पिक है:

var firstName: String = nil

यह कोड निम्नलिखित संकलन समय त्रुटि पैदा करता है:

टाइप 'स्ट्रिंग' प्रोटोकॉल 'NilLiteralConvertible' के अनुरूप नहीं है

यह भी ध्यान रखना महत्वपूर्ण है कि स्विफ्ट में एनआईएल उद्देश्य-सी में शून्य से अलग है। ऑब्जेक्टिव-सी में, शून्य एक गैर-मौजूद वस्तु का सूचक है। स्विफ्ट में, एनआईएल केवल एक मूल्य की अनुपस्थिति को इंगित करता है - यह एक संकेतक नहीं है। इसका मतलब यह है कि आप किसी भी प्रकार के वैकल्पिक को निर्दिष्ट कर सकते हैं, न कि केवल ऑब्जेक्ट प्रकार के।

वैकल्पिक मूल्यों तक पहुँच

अन्य प्रोग्रामिंग भाषाओं के विपरीत, स्विफ्ट में, आप सीधे एक वैकल्पिक मूल्य तक नहीं पहुंच सकते हैं । आपको इसके अंतर्निहित मूल्य तक पहुंचने के लिए पहले वैकल्पिक को खोलना चाहिए। उदाहरण के लिए निम्न कोड लें:

var पहला नाम: स्ट्रिंग = "रयान"

var मध्यनाम: स्ट्रिंग? = "माइकल"

var firstAndMiddleNames: स्ट्रिंग

FirstAndMiddleNames = firstName + "" + मध्यनाम

कोड की पहली तीन पंक्तियाँ एक प्रथमनाम स्ट्रिंग चर, एक मध्यनाम वैकल्पिक स्ट्रिंग चर, और एक प्रथम नाम स्ट्रिंग नाम घोषित करती हैं। कोड की अगली पंक्ति पहले नाम और मध्यनाम चर मानों को एक साथ जोड़ती है (बीच-बीच में परिवर्तनशील मान)। आपको यह जानकर आश्चर्य हो सकता है कि कोड की यह लाइन निम्नलिखित संकलन समय त्रुटि उत्पन्न करती है:

विकल्प का प्रकार 'स्ट्रिंग?' अलिखित नहीं; क्या आपका मतलब था '!' या '?'

यह स्विफ्ट के सुरक्षा तंत्रों में से एक है। यह आपको यह स्वीकार करने के लिए मजबूर करता है कि मूल्य संभवतः शून्य हो सकता है। तो, आप एक वैकल्पिक को कैसे खोलते हैं? निम्नलिखित अनुभागों में वर्णित दो मुख्य तरीके हैं।

ऑप्शनल के लिए जबरन अनवांटिंग का उपयोग करना

जैसा कि पिछले अनुभाग में संकलक त्रुटि के द्वारा सुझाया गया है, वैकल्पिक मान को अनफ्रैप करने का एक तरीका यह है कि वैकल्पिक रूप से इसे स्पष्ट रूप से अनचाहे रखने के बाद विस्मयादिबोधक चिह्न (!) का उपयोग करें। उदाहरण के लिए:

firstAndMiddleNames = firstName + " " + middleName!

यह मैन्युअल रूप से मध्यम नाम के मान को अपरिवर्तित रखने के लिए मजबूर करता है । हालाँकि, यदि मध्यनाम में रन टाइम में एक nil है, तो यह EXC_BAD_INSTRUCTION रन टाइम त्रुटि उत्पन्न करेगा। तो, आप स्पष्ट रूप से जब तक आप पूरी तरह से सुनिश्चित नहीं हैं कि मूल्य शून्य नहीं है, तब तक जबरन उपयोग नहीं करना चाहते हैं।

वैकल्पिक बाउंड का उपयोग करना

यदि आप वैकल्पिक में कोई मान शामिल करते हैं, तो परीक्षण के लिए वैकल्पिक बाध्यकारी के रूप में जानी जाने वाली तकनीक का उपयोग कर सकते हैं, और यदि ऐसा है, तो उस मान को एक अस्थायी चर या स्थिर में संग्रहीत करें। यह दिखाने के लिए कि यह हमारे पिछले उदाहरण के साथ कैसे काम करता है, इस कोड को देखें:

var firstName: String = "Ryan"

var मध्यनाम: स्ट्रिंग? = "माइकल"

var firstAndMiddleNames: स्ट्रिंग

if आज्ञा देना = बीच में आना

{

FirstAndMiddleNames = firstName + "" + मध्य

}

अन्य

{

firstAndMiddleNames = पहला नाम

}

जब रन टाइम में अगर कंडीशन चेक की जाती है, अगर मिडलनेम वैरिएबल में स्ट्रिंग वैल्यू होती है, तो कंडीशन सही होती है, तो मिडल नेम वैरिएबल में मौजूद वैल्यू को अनकैप्ड किया जाता है, बीच में स्टोर किया जाता है और अगर स्टेटमेंट के कर्ली ब्रेसेस के अंदर कोड होता है निष्पादित किया जाता है।

यदि मध्यनाम चर में शून्य होता है, तो स्थिति झूठी का मूल्यांकन करती है, वैकल्पिक मूल्य को अलिखित नहीं किया जाता है, और अन्य विवरण के घुंघराले ब्रेसिज़ में कोड निष्पादित किया जाता है।

अवैध रूप से अनचाहे वैकल्पिक

स्विफ्ट में भी कुछ होता है जिसे इम्प्लांटली अलिखित वैकल्पिक कहा जाता है। ये वैकल्पिक हैं जिन्हें जबरन अलिखित (!) या वैकल्पिक बंधन का उपयोग करके अलिखित होने की आवश्यकता नहीं है क्योंकि वे अंतर्निहित (स्वचालित रूप से) अलिखित हैं। उन्हें प्रश्नवाचक चिन्ह (?) के बजाय विस्मयादिबोधक चिह्न (!) का उपयोग करके घोषित किया जाता है।

इंटरफ़ेस बिल्डर आउटलेट्स ( IBOutlet गुण) के साथ काम करते समय आप अक्सर अनुमानित रूप से अलिखित वैकल्पिक को देखते हैं। उदाहरण के लिए:

@IBOutlet weak var lblDescription: UILabel!

इस कोड में, lblDescription आउटलेट की संपत्ति के बाद एक विस्मयादिबोधक चिह्न है, यह दर्शाता है कि यह अंतर्निहित रूप से अपरिवर्तित है। यह आपको संपत्ति को बिना अलिखित करने के लिए उपयोग करने की अनुमति देता है।

इस उदाहरण में, आउटलेट संपत्ति में एक लेबल का संदर्भ शामिल करने की गारंटी नहीं है, लेकिन यह बिल्कुल होना चाहिए । यदि इसमें किसी लेबल का संदर्भ नहीं है, तो इसका मतलब है कि आउटलेट और लेबल के बीच का संबंध टूट गया है। उस स्थिति में, रन-टाइम त्रुटि होना ठीक है क्योंकि आप जानना चाहते हैं कि कनेक्शन टूट गया है ताकि आप इसे ठीक कर सकें!

जाहिर है, ऐसे मामलों में जहां आप 100 प्रतिशत सुनिश्चित नहीं हैं कि एक स्थिर या चर में एक मूल्य होता है जो आपको इसके बजाय एक नियमित वैकल्पिक का उपयोग करना चाहिए।

निष्कर्ष

वैकल्पिक स्विफ्ट की एक बड़ी नई विशेषता है जो आपको अपने iOS ऐप में शून्य मानों को सुरक्षित रूप से संभालने की अनुमति देती है। मैं यह सुनिश्चित करने के लिए इस पोस्ट की समीक्षा करने की सलाह देता हूं कि आप बुनियादी अवधारणाओं को समझें, और फिर स्विफ्ट में वैकल्पिक विकल्पों का उपयोग कैसे करें, इसके बारे में अधिक जानने के लिए ऐपल की द स्विफ्ट प्रोग्रामिंग लैंग्वेज बुक पर वापस जाएं।