अन्य उपयोगी लेकिन अधिक विवरण-केंद्रित उत्तर में जोड़ने के लिए कुछ बड़े चित्र परिप्रेक्ष्य:
स्विफ्ट में, विस्मयादिबोधक बिंदु कई संदर्भों में प्रकट होता है:
- जबरन गिरवी रखना:
let name = nameLabel!.text
- वैकल्पिक रूप से अपरिवर्तित वैकल्पिक:
var logo: UIImageView!
- जबरन कास्टिंग:
logo.image = thing as! UIImage
- बिना किसी अपवाद के:
try! NSJSONSerialization.JSONObjectWithData(data, [])
इनमें से हर एक एक अलग अर्थ के साथ एक अलग भाषा का निर्माण है, लेकिन वे सभी तीन महत्वपूर्ण चीजें हैं:
1. विस्मयादिबोधक बिंदु स्विफ्ट के संकलन-समय सुरक्षा जांच को रोकते हैं।
जब आप !
स्विफ्ट में उपयोग करते हैं, तो आप अनिवार्य रूप से कह रहे हैं, "अरे, संकलक, मुझे पता है कि आपको लगता है कि यहां एक त्रुटि हो सकती है, लेकिन मैं पूरी निश्चितता के साथ जानता हूं कि यह कभी नहीं होगा।"
सभी मान्य कोड स्विफ्ट के संकलन-समय प्रकार प्रणाली के बॉक्स में फिट नहीं होते हैं - या किसी भी भाषा के स्थिर प्रकार की जाँच, उस मामले के लिए। ऐसी स्थितियां हैं जहां आप तार्किक रूप से साबित कर सकते हैं कि कोई त्रुटि कभी नहीं होगी, लेकिन आप इसे संकलक के लिए साबित नहीं कर सकते । यही कारण है कि स्विफ्ट के डिजाइनरों ने इन सुविधाओं को पहले स्थान पर जोड़ा।
हालाँकि, जब भी आप उपयोग करते हैं !
, आप एक त्रुटि के लिए रिकवरी पथ होने का निर्णय ले रहे हैं, जिसका अर्थ है कि…
2. विस्मय बोधक बिंदु संभावित क्रैश हैं।
एक विस्मयादिबोधक बिंदु यह भी कहता है, "हे स्विफ्ट, मैं इतना निश्चित हूं कि यह त्रुटि कभी नहीं हो सकती है कि मेरे लिए अपने संपूर्ण एप्लिकेशन को क्रैश करने से बेहतर है कि आप इसके लिए एक पुनर्प्राप्ति पथ कोड करें।"
यह एक खतरनाक दावा है। यह सही हो सकता है: मिशन-क्रिटिकल कोड में जहां आपने अपने कोड के इनवेरिएंट के बारे में कठिन सोचा है, यह हो सकता है कि फर्जी आउटपुट क्रैश से भी बदतर है।
हालांकि, जब मैं !
जंगली में देखता हूं, तो यह शायद ही कभी दिमाग से उपयोग किया जाता है। इसके बजाय, इसका अक्सर अर्थ होता है, "यह मूल्य वैकल्पिक था और मैंने वास्तव में बहुत कठिन नहीं सोचा था कि यह शून्य क्यों हो सकता है या उस स्थिति को ठीक से कैसे संभाल सकता है, लेकिन !
इसे संकलित किया गया ... इसलिए मेरा कोड सही है, है ना?"
विस्मयादिबोधक बिंदु के अहंकार से सावधान रहें। बजाय…
3. विस्मयादिबोधक बिंदु का सबसे अच्छा इस्तेमाल किया जाता है।
इनमें से हर एक !
निर्माण में एक ?
प्रतिपक्ष होता है जो आपको त्रुटि / शून्य मामले से निपटने के लिए मजबूर करता है:
- सशर्त अलौकिक:
if let name = nameLabel?.text { ... }
- optionals:
var logo: UIImageView?
- सशर्त जातियां:
logo.image = thing as? UIImage
- निल-ऑन-फेल अपवाद:
try? NSJSONSerialization.JSONObjectWithData(data, [])
यदि आप उपयोग करने के लिए ललचाते हैं !
, तो हमेशा ध्यान से विचार करना अच्छा है कि आप ?
इसके बजाय उपयोग क्यों नहीं कर रहे हैं । यदि !
ऑपरेशन विफल हो जाता है तो क्या वास्तव में आपके प्रोग्राम को सबसे अच्छा विकल्प है? वह मूल्य वैकल्पिक / उपलब्ध क्यों नहीं है?
क्या एक उचित पुनर्प्राप्ति पथ आपके कोड को शून्य / त्रुटि मामले में ले सकता है? यदि हां, तो इसे कोड करें।
यदि यह संभवतः शून्य नहीं हो सकता है, यदि त्रुटि कभी नहीं हो सकती है, तो क्या आपके तर्क को फिर से बनाने का एक उचित तरीका है ताकि संकलक ऐसा हो? यदि ऐसा है, तो करें; आपका कोड कम त्रुटि वाला होगा।
ऐसे समय होते हैं जब किसी त्रुटि को संभालने का कोई उचित तरीका नहीं होता है, और बस त्रुटि को अनदेखा कर देता है - और इस प्रकार गलत डेटा के साथ आगे बढ़ना - दुर्घटनाग्रस्त होने से भी बदतर होगा । वे समय बल प्रयोग का समय है।
मैं समय-समय पर इसके संपूर्ण !
उपयोग के लिए अपना पूरा कोडबेस खोजता हूं और ऑडिट करता हूं । बहुत कम उपयोग करने वाले लोग जांच के लिए खड़े होते हैं। (इस लेखन के रूप में, पूरे Siesta ढांचे के इसके दो उदाहरण हैं।)
यह कहने के लिए नहीं है कि आपको अपने कोड में कभी भी उपयोग नहीं करना चाहिए !
- बस यह कि आप इसे सावधानी से उपयोग करें , और इसे कभी भी डिफ़ॉल्ट विकल्प न बनाएं।