स्विफ्ट प्रकार की सुरक्षा पर एक उच्च प्रीमियम रखता है। संपूर्ण स्विफ्ट भाषा को सुरक्षा को ध्यान में रखकर डिजाइन किया गया था। यह स्विफ्ट के हॉलमार्क में से एक है और जिसका आपको खुली बांहों से स्वागत करना चाहिए। यह स्वच्छ, पठनीय कोड के विकास में सहायता करेगा और आपके एप्लिकेशन को दुर्घटनाग्रस्त होने से बचाने में मदद करेगा।
स्विफ्ट में सभी वैकल्पिकों को ?
प्रतीक के साथ सीमांकित किया जाता है। ?
जिस प्रकार के विकल्प को आप वैकल्पिक घोषित कर रहे हैं , उसके नाम को निर्धारित करके आप अनिवार्य रूप से इसे उस प्रकार के रूप में नहीं डाल रहे हैं, जिसमें पहले है ?
, बल्कि वैकल्पिक प्रकार के रूप में है ।
ध्यान दें: एक चर या प्रकार Int
है नहीं के रूप में ही Int?
। वे दो अलग-अलग प्रकार हैं जिन्हें एक दूसरे पर संचालित नहीं किया जा सकता है।
वैकल्पिक का उपयोग करना
var myString: String?
myString = "foobar"
इसका मतलब यह नहीं है कि आप एक प्रकार के साथ काम कर रहे हैं String
। इसका मतलब है कि आप एक प्रकार के String?
(स्ट्रिंग ऑप्शनल या वैकल्पिक स्ट्रिंग) के साथ काम कर रहे हैं । वास्तव में, जब भी आप प्रयास करें
print(myString)
रनटाइम पर, डिबग कंसोल प्रिंट होगा Optional("foobar")
। " Optional()
" भाग इंगित करता है कि इस चर का रनटाइम पर कोई मान नहीं हो सकता है, लेकिन अभी ऐसा होता है कि वर्तमान में स्ट्रिंग "फोब्बर" हो सकता है। यह " Optional()
" संकेत तब तक बना रहेगा जब तक कि आप वह नहीं करते हैं जिसे वैकल्पिक मान "अलिखित" कहा जाता है।
एक वैकल्पिक का अनावरण करने का अर्थ है कि आप अब उस प्रकार को गैर-वैकल्पिक के रूप में कास्टिंग कर रहे हैं। यह एक नया प्रकार उत्पन्न करेगा और नए गैर-वैकल्पिक प्रकार के लिए उस वैकल्पिक के भीतर रहने वाले मान को असाइन करेगा। इस तरह से आप उस चर पर परिचालन कर सकते हैं क्योंकि यह संकलक द्वारा ठोस मूल्य रखने की गारंटी देता है।
सशर्त unwrapping जांच करेगा कि वैकल्पिक में मूल्य है nil
या नहीं। यदि ऐसा नहीं है nil
, वहाँ एक नव निर्मित निरंतर परिवर्तनशील है कि मूल्य और आवंटित किया जाएगा हो जाएगा unwrapped गैर वैकल्पिक निरंतर में। और वहां से आप if
ब्लॉक में गैर-वैकल्पिक का सुरक्षित रूप से उपयोग कर सकते हैं ।
नोट: आप अपने सशर्त रूप से अपरिवर्तित स्थिर नाम को उसी चर के रूप में दे सकते हैं जिसे आप अलिखित कर रहे हैं।
if let myString = myString {
print(myString)
// will print "foobar"
}
वैकल्पिक रूप से अल्टरनेटिंग अल्टरनेट्स एक वैकल्पिक मूल्य तक पहुंचने का सबसे साफ तरीका है क्योंकि यदि इसमें शून्य मान होता है तो अगर लेट ब्लॉक निष्पादित नहीं होगा तो सब कुछ। बेशक, किसी भी बयान की तरह, आप एक और ब्लॉक शामिल कर सकते हैं
if let myString = myString {
print(myString)
// will print "foobar"
}
else {
print("No value")
}
जबरन Unwrapping को !
"(बैंग") ऑपरेटर के रूप में जाना जाता है जिसे नियोजित करके किया जाता है । यह कम सुरक्षित है लेकिन फिर भी आपके कोड को संकलित करने की अनुमति देता है। हालांकि जब भी आप बैंग ऑपरेटर का उपयोग करते हैं तो आपको 1000% निश्चित होना चाहिए कि आपके चर वास्तव में जबरन अलिखित करने से पहले एक ठोस मूल्य रखते हैं।
var myString: String?
myString = "foobar"
print(myString!)
यह ऊपर पूरी तरह से वैध स्विफ्ट कोड है। यह उस मूल्य को प्रिंट करता है जिसे myString
"फोब्बर" के रूप में सेट किया गया था। उपयोगकर्ता foobar
कंसोल में मुद्रित होता है और इसके बारे में है। लेकिन मान लेते हैं कि मूल्य कभी निर्धारित नहीं था:
var myString: String?
print(myString!)
अब हमारे हाथों पर एक अलग स्थिति है। ऑब्जेक्टिव-सी के विपरीत, जब भी किसी विकल्प को जबरन बंद करने का प्रयास किया जाता है, और वैकल्पिक सेट नहीं किया गया है और nil
जब आप वैकल्पिक को अनट्रैप करने की कोशिश करते हैं, तो यह देखने के लिए कि आपके एप्लिकेशन के अंदर क्या दुर्घटना होगी।
अनवांटेड w / टाइप कास्टिंग । जैसा कि हमने पहले कहा था कि जब आप unwrapping
वैकल्पिक होते हैं तो आप वास्तव में एक गैर-वैकल्पिक प्रकार के लिए कास्टिंग करते हैं, आप गैर-वैकल्पिक को एक अलग प्रकार में भी डाल सकते हैं। उदाहरण के लिए:
var something: Any?
कहीं न कहीं हमारे कोड में वेरिएबल something
कुछ मूल्य के साथ सेट हो जाएगा। हो सकता है कि हम जेनेरिक का उपयोग कर रहे हों या हो सकता है कि कुछ और तर्क हैं जो इस पर चल रहे हैं कि इससे बदलाव आएगा। इसलिए बाद में हमारे कोड में हम इसका उपयोग करना चाहते हैं something
लेकिन फिर भी यदि यह एक अलग प्रकार है तो इसका इलाज अलग तरह से किया जा सकता है। इस स्थिति में आप इसे as
निर्धारित करने के लिए कीवर्ड का उपयोग करना चाहेंगे :
नोट: as
ऑपरेटर है कि आप स्विफ्ट में कैसे टाइप करते हैं।
// Conditionally
if let thing = something as? Int {
print(thing) // 0
}
// Optionally
let thing = something as? Int
print(thing) // Optional(0)
// Forcibly
let thing = something as! Int
print(thing) // 0, if no exception is raised
दो as
खोजशब्दों के बीच अंतर पर ध्यान दें । पहले की तरह जब हमने जबरन एक अलिखित विकल्प का उपयोग किया तो हमने ऐसा करने के लिए !
बैंग ऑपरेटर का उपयोग किया । यहां आप एक ही काम करेंगे लेकिन सिर्फ एक गैर-वैकल्पिक के रूप में कास्टिंग करने के बजाय आप इसे भी कास्टिंग कर रहे हैं Int
। और यह डाउनकास्ट होने में सक्षम होना चाहिए Int
, अन्यथा, जैसे कि बैंग ऑपरेटर का उपयोग करना जब मूल्य nil
आपका एप्लिकेशन क्रैश हो जाएगा।
और किसी प्रकार या गणितीय ऑपरेशन में इन चर का उपयोग करने के लिए उन्हें ऐसा करने के लिए अलिखित होना चाहिए।
उदाहरण के लिए, स्विफ्ट में केवल एक ही तरह के वैध संख्या डेटा प्रकार एक दूसरे पर संचालित किए जा सकते हैं। जब आप एक प्रकार as!
डालते हैं तो आप उस चर के डाउनकास्ट को मजबूर कर रहे होते हैं, क्योंकि आप निश्चित हैं कि यह उस प्रकार का है, इसलिए आपके एप्लिकेशन को चालू करने और क्रैश न करने के लिए सुरक्षित है। यह तब तक ठीक है जब तक कि चर वास्तव में उस प्रकार का है जिसे आप इसे डाल रहे हैं, अन्यथा आपके हाथों पर गड़बड़ होगी।
फिर भी के साथ कास्टिंग as!
आपके कोड को संकलित करने की अनुमति देगा। के साथ कास्टिंग करके as?
एक अलग कहानी है। वास्तव में, as?
अपने सभी Int
को एक साथ पूरी तरह से अलग डेटा प्रकार के रूप में घोषित करता है ।
अब यह है Optional(0)
और अगर आपने कभी अपना होमवर्क कुछ ऐसा लिखने की कोशिश की
1 + Optional(1) = 2
आपके गणित शिक्षक ने आपको "एफ" की संभावना दी होगी। स्विफ्ट के साथ भी। स्विफ्ट को छोड़कर आप एक ग्रेड देने के बजाय बिल्कुल भी संकलन नहीं करेंगे। क्योंकि दिन के अंत में वैकल्पिक वास्तव में शून्य हो सकता है ।
सुरक्षा पहले बच्चे।