दिलचस्प पोस्ट
किसी अन्य डोमेन के लिए कुकी कैसे सेट करें एक ब्लूटूथ डिवाइस कनेक्ट होने पर प्रोग्रामेटिक रूप से कैसे बताएंगे? (एंड्रॉइड 2.2) पायथन में आम नुकसान UIProgressView की ऊंचाई कैसे बढ़ाएं किस प्रकार का उपयोग करें: jsonp ajax कॉल में "पोस्ट" क्रोम डेवलपर उपकरण: सीएसएस नियम को ओवरराइड करने का तरीका क्या है? संवेदनशील फ़ाइलों को निकालें और Git इतिहास से उनके कमान निकाल दें बाईंओर तैरना; बनाम प्रदर्शन: इनलाइन; बनाम प्रदर्शन: इनलाइन-ब्लॉक; बनाम प्रदर्शन: टेबल-सेल; जीआईटी के साथ चेरी को चुनने का क्या मतलब है? महीना वर्ष दिखाने के लिए केवल jQuery UI DatePicker किसी अन्य प्रोजेक्ट में एक एंड्रॉइड लाइब्रेरी प्रोजेक्ट गतिविधि का उपयोग करना स्ट्रिंग पर गड़गड़ाहट दिए गए फ़ाइल वाले फाइल सिस्टम के आकार और रिक्त स्थान खोजें मैं कैसे पता लगा सकता हूं कि उपयोगकर्ता के पास आईफोन 6 प्लस मानक या ज़ूम मोड में है? फ़ंक्शन रिटर्निंग खुद

स्विफ्ट भाषा में विस्मयादिबोधक चिह्न का क्या अर्थ है?

स्विफ्ट प्रोग्रामिंग भाषा गाइड में निम्न उदाहरण हैं:

class Person { let name: String init(name: String) { self.name = name } var apartment: Apartment? deinit { println("\(name) is being deinitialized") } } class Apartment { let number: Int init(number: Int) { self.number = number } var tenant: Person? deinit { println("Apartment #\(number) is being deinitialized") } } var john: Person? var number73: Apartment? john = Person(name: "John Appleseed") number73 = Apartment(number: 73) //From Apple's “The Swift Programming Language” guide (https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html) 

फिर जब व्यक्ति को अपार्टमेंट को निर्दिष्ट करते हैं, तो वे "उद्घाटन खोलना" के लिए विस्मयादिबोधक बिंदु का उपयोग करते हैं:

 john!.apartment = number73 

"उदाहरण को खोलना" का क्या अर्थ है? यह आवश्यक क्यों है? ये केवल निम्नलिखित कार्य करने से अलग है:

 john.apartment = number73 

मैं स्विफ्ट भाषा में बहुत नया हूँ बस मूल बातें नीचे लाने की कोशिश कर रहा है

अद्यतन करें:
जिस पहेली को मैं याद कर रहा था उसका बड़ा टुकड़ा (जवाब में सीधे नहीं कहा गया – कम से कम यह लिखने के समय नहीं) यह है कि जब आप निम्न करते हैं:

 var john: Person? 

इसका अर्थ यह नहीं है कि " john Person का प्रकार है और यह शून्य हो सकता है", जैसा कि मैंने मूल रूप से सोचा था। मैं बस उस Person और Person? गलत समझ रहा था Person? पूरी तरह अलग प्रकार हैं एक बार जब मैंने समझा कि, अन्य सभी ? , ! पागलपन, और नीचे दिए गए महान उत्तर, बहुत अधिक समझ गए

Solutions Collecting From Web of "स्विफ्ट भाषा में विस्मयादिबोधक चिह्न का क्या अर्थ है?"

"उदाहरण को खोलना" का क्या अर्थ है? यह आवश्यक क्यों है?

जहां तक ​​मैं काम कर सकता हूं (यह मेरे लिए बहुत नया है) …

"लिपटे" शब्द का अर्थ है कि हमें एक वैकल्पिक वैरिएबल को वर्तमान के रूप में सोचना चाहिए , चमकदार कागज में लिपटे, जो कि (दुख की बात!) खाली हो

जब "लिपटे", एक वैकल्पिक वैरिएबल का मान दो संभावित मूल्यों (एक बूलियन की तरह थोड़ी सी) के साथ एक एन्यूम है। यह एन्यूम बताता है कि चर में मूल्य ( Some(T) ), या नहीं ( None ) है।

यदि कोई मान है, तो यह चर (" Some(T) से T प्राप्त करने के लिए" अनलॉकिंग से प्राप्त किया जा सकता है।

john!.apartment = number73 कैसे होता है john!.apartment = number73 जो john.apartment = number73 से अलग है? (भावानूदित)

यदि आप वैकल्पिक वैरिएबल (जैसे पाठ john , बिना ! ) का नाम लिखते हैं, तो यह "लिपटे" एन्यूम (कुछ / कोई नहीं) को संदर्भित करता है, मान ही नहीं (टी)। तो john Person का एक उदाहरण नहीं है, और इसमें apartment सदस्य नहीं है:

 john.apartment // 'Person?' does not have a member named 'apartment' 

वास्तविक Person मूल्य को विभिन्न तरीकों से अनवरोधित किया जा सकता है:

  • "जबरन खोलना": john! (यदि Person मौजूद है, तो रनटाइम त्रुटि देता है अगर यह शून्य है)
  • "वैकल्पिक बाध्यकारी": if let p = john { println(p) } (यदि मूल्य मौजूद है तो println निष्पादित करता है)
  • "वैकल्पिक चेनिंग": john?.learnAboutSwift() (यदि यह मान मौजूद है तो यह निर्मित विधि को निष्पादित करता है)

मुझे लगता है कि आप खोलने के लिए इन तरीकों में से किसी एक को चुनते हैं, यह इस बात पर निर्भर करता है कि क्या नील केस में होना चाहिए, और यह कितनी संभावना है। यह भाषा डिज़ाइन नीले मामले को स्पष्ट रूप से नियंत्रित करने के लिए मजबूर करता है, जो मुझे लगता है कि Obj-C (जहां शून्य मामले को संभालना आसान है) पर सुरक्षा में सुधार होता है।

अपडेट करें :

विस्मयादिबोधक चिह्न "अनप्लगतापूर्वक अनवरोधित विकल्प" को घोषित करने के लिए वाक्यविन्यास में भी उपयोग किया जाता है।

अब तक के उदाहरणों में, john वैरिएबल को var john:Person? रूप में घोषित किया गया है var john:Person? , और यह एक वैकल्पिक है यदि आप उस वेरिएबल के वास्तविक मान चाहते हैं, तो आपको इसके ऊपर तीन तरीकों में से एक का उपयोग करना चाहिए।

अगर इसे var john:Person! रूप में घोषित किया गया था var john:Person! इसके बदले, वेरिएबल एक अनप्लगलिखित अनारक्षित वैकल्पिक होगा (ऐप्पल की पुस्तक में इस शीर्षक के साथ अनुभाग देखें)। मूल्य तक पहुंचने पर इस प्रकार के चर को खोलने की कोई आवश्यकता नहीं है, और john अतिरिक्त वाक्यविन्यास के बिना उपयोग किया जा सकता है। लेकिन ऐप्पल की किताब कहती है:

किसी अनियंत्रित विकल्प के विकल्प का उपयोग तब नहीं किया जाना चाहिए जब बाद में एक चर बनने की संभावना हो। हमेशा एक सामान्य वैकल्पिक प्रकार का उपयोग करें यदि आपको किसी चर के जीवनकाल के दौरान शून्य मान की जांच करने की आवश्यकता है

अपडेट 2 :

माइक ऐश द्वारा लेख " दिलचस्प स्विफ्ट सुविधाएँ " वैकल्पिक प्रकारों के लिए कुछ प्रेरणा देता है। मुझे लगता है कि यह महान, स्पष्ट लेखन है

अपडेट 3 :

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

शायद एप्पल भविष्य में उनके चौखटे के माध्यम से कंघी कर सकता है, बिना किसी अनिर्धारित ("शायद कभी भी कभी नहीं") पैरामीटर की अनिश्चितता को हटाने और उन्हें वैकल्पिक ("निश्चित रूप से विशेष रूप से शून्य [उम्मीद है, दस्तावेज!] परिस्थितियों") या मानक गैर -विशिष्ट ("कभी नहीं होता है") घोषणाएं, उनके उद्देश्य-सी कोड के सटीक व्यवहार के आधार पर।

यहाँ जो मुझे लगता है वह अंतर है:

 var john: Person? 

मतलब जॉन शून्य हो सकता है

 john?.apartment = number73 

कंपाइलर इस रेखा को इस रूप में व्याख्या करेगा:

 if john != nil { john.apartment = number73 } 

जबकि

 john!.apartment = number73 

कंपाइलर इस रेखा को बस के रूप में व्याख्या करेगा:

 john.apartment = number73 

इसलिए, का उपयोग कर! अगर बयान खोल देगा, और इसे तेजी से चलाएगा, लेकिन अगर जॉन शून्य है, तो एक रनटाइम त्रुटि होगी।

तो यहां लपेटो इसका मतलब यह नहीं है कि यह स्मृति लिपटे है, लेकिन इसका मतलब है कि यह कोड लिपटे है, इस मामले में यह एक बयान के साथ लपेटा जाता है, और क्योंकि एप्लेट रनटाइम में प्रदर्शन पर ध्यान देते हैं, वे आपको एक रास्ता देना चाहते हैं अपने ऐप को बेहतरीन प्रदर्शन के साथ चलाएं।

टी एल; डॉ

स्विफ्ट भाषा में विस्मयादिबोधक चिह्न का क्या अर्थ है?

विस्मयादिबोधक चिह्न प्रभावी ढंग से कहता है, "मुझे पता है कि इस वैकल्पिक रूप से निश्चित रूप से एक मूल्य है; कृपया इसका उपयोग करें। "यह वैकल्पिक के मूल्य के लिए मजबूर रूप से खोलना के रूप में जाना जाता है:

उदाहरण

 let possibleString: String? = "An optional string." print(possibleString!) // requires an exclamation mark to access its value // prints "An optional string." let assumedString: String! = "An implicitly unwrapped optional string." print(assumedString) // no exclamation mark is needed to access its value // prints "An implicitly unwrapped optional string." 

स्रोत: https://developer.apple.com/library/content/documentation/swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-XID_399

यदि जॉन वैकल्पिक वैर थे (घोषित रूप से घोषित)

 var john: Person? 

तो यह संभव होगा कि जॉन के पास कोई मूल्य न हो (ObjC भाषा में, शून्य मान)

विस्मयादिबोधक बिंदु मूल रूप से कंपाइलर को बताता है "मुझे पता है कि इसका मान है, आपको इसकी जांच करने की आवश्यकता नहीं है"। यदि आप इसका उपयोग नहीं करना चाहते हैं, तो आप इसके लिए सशर्त परीक्षण कर सकते हैं:

 if let otherPerson = john { otherPerson.apartment = number73 } 

इस के इंटीरियर का मूल्यांकन केवल जॉन के मूल्य का होगा।

john एक वैकल्पिक var तो एक nil मूल्य शामिल किया जा सकता है यह सुनिश्चित करने के लिए कि मूल्य शून्य नहीं है ! var नाम के अंत में

दस्तावेज़ीकरण से

"एक बार जब आप यह सुनिश्चित कर लें कि वैकल्पिक में कोई मान शामिल है, तो आप वैकल्पिक नाम के अंत में विस्मयादिबोधक चिह्न (!) जोड़कर इसके अंतर्निहित मूल्य तक पहुंच सकते हैं विस्मयादिबोधक चिह्न प्रभावी रूप से कहते हैं, "मुझे पता है कि इस वैकल्पिक रूप से निश्चित रूप से एक मूल्य है; कृपया इसका उपयोग करें। "

गैर शून्य मूल्य की जांच करने का एक अन्य तरीका है

  if let j = json { // do something with j } 

अन्य उपयोगी लेकिन अधिक विस्तार-केंद्रित उत्तर में जोड़ने के लिए कुछ बड़े चित्र परिप्रेक्ष्य:

स्विफ्ट में, विस्मयादिबोधक बिंदु कई संदर्भों में प्रकट होता है:

  • जबरन let name = nameLabel!.text : let name = nameLabel!.text
  • स्पष्ट रूप से अनचाहे विकल्प: var logo: UIImageView!
  • जबरन कास्टिंग: logo.image = thing as! UIImage logo.image = thing as! UIImage
  • अप्रतिबंधित अपवाद: try! NSJSONSerialization.JSONObjectWithData(data, []) try! NSJSONSerialization.JSONObjectWithData(data, [])

इनमें से हर एक अलग भाषा का निर्माण एक अलग अर्थ के साथ होता है, लेकिन उन सभी में आम में तीन महत्वपूर्ण चीजें हैं:

1. विस्मयादिबोधक बिंदु स्विफ्ट की संकलन-समय सुरक्षा जांच को दरकिनार करते हैं।

जब आप उपयोग करते हैं ! स्विफ्ट में, आप अनिवार्य रूप से कह रहे हैं, "हे, कंपाइलर, मुझे पता है कि आपको लगता है कि कोई त्रुटि यहां हो सकती है, लेकिन मैं पूरी निश्चितता से जानता हूं कि यह कभी नहीं होगा।"

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

हालांकि, जब भी आप उपयोग करते हैं ! , आप एक त्रुटि के लिए एक पुनर्प्राप्ति पथ होने का निर्णय कर रहे हैं, जिसका अर्थ है कि …

विस्मयादिबोधक अंक संभावित क्रैश होते हैं।

एक विस्मयादिबोधक बिंदु भी कहते हैं, "अरे स्विफ्ट, मैं यह निश्चित है कि यह त्रुटि कभी नहीं हो सकती है क्योंकि मेरे लिए मेरे पूरे ऐप को क्रैश करने के लिए यह बेहतर है क्योंकि इसके लिए मुझे एक पुनर्प्राप्ति पथ कोड है।"

यह एक खतरनाक दावा है यह सही हो सकता है: मिशन-महत्वपूर्ण कोड में जहां आपने अपने कोड के इनवेरिएंटों के बारे में सोचा है, यह हो सकता है कि फर्जी आउटपुट क्रैश से भी बदतर है

हालांकि, जब मैं देख रहा हूँ ! जंगली में, यह शायद ही कभी दिमाग से इस्तेमाल किया जाता है इसके बजाय, इसका अक्सर इसका अर्थ होता है, "यह मान वैकल्पिक था और मुझे वाकई बहुत मुश्किल नहीं लगता था कि यह क्यों नील हो सकता है या इसके बारे में क्या हो सकता है, लेकिन जोड़ें ! इसे संकलित किया … तो मेरा कोड अच्छा है, है ना? "

विस्मयादिबोधक बिंदु का अहंकार सावधान रहें बजाय…

3. विस्मयादिबोधक बिंदु सबसे अच्छे रूप से इस्तेमाल किए जाते हैं, लगभग कभी नहीं।

इनमें से हर एक ! निर्माण एक है ? समकक्ष है जो आपको त्रुटि / शून्य मामले से निपटने के लिए मजबूर करता है:

  • सशर्त if let name = nameLabel?.text { ... } : if let name = nameLabel?.text { ... }
  • वैकल्पिक: var logo: UIImageView?
  • सशर्त डाली: logo.image = thing as? UIImage logo.image = thing as? UIImage
  • शून्य-पर-विफलता अपवाद: try? NSJSONSerialization.JSONObjectWithData(data, []) try? NSJSONSerialization.JSONObjectWithData(data, [])

यदि आप का उपयोग करने के लिए परीक्षा है ! , ध्यान से विचार करना हमेशा अच्छा होता है कि आप क्यों नहीं उपयोग कर रहे हैं ? बजाय। आपके कार्यक्रम को दुर्घटनाग्रस्त होने पर वास्तव में सबसे अच्छा विकल्प है ! ऑपरेशन विफल रहता है? क्या कोई उचित पुनर्प्राप्ति पथ आपके कोड को शून्य / त्रुटि मामले में ले सकता है? यदि हां, तो यह कोड

मैं समय-समय पर अपने पूरे कोडबेस को खोजता हूं ! और इसके हर प्रयोग की ऑडिट करें। बहुत कुछ प्रयोग छानबीन के लिए खड़े हैं। (इस लेखन के अनुसार, पूरे सिएस्टा फ्रेमवर्क में इसके दो उदाहरण हैं।)

यह कहना नहीं है कि आपको कभी भी उपयोग नहीं करना चाहिए ! आपके कोड में – बस आपको इसे हमेशा सावधानी से इस्तेमाल करना चाहिए, और इसे कभी भी डिफ़ॉल्ट विकल्प न बनाएं

यहाँ कुछ उदाहरण हैं:

 var name:String = "Hello World" var word:String? 

जहां word एक वैकल्पिक मूल्य है इसका मतलब यह हो सकता है कि मूल्य हो या न हो।

 word = name 

यहां name का एक मान है इसलिए हम उसे निर्दिष्ट कर सकते हैं

 var cow:String = nil var dog:String! 

जहां dog जबरदस्ती तरीके से खोलना है इसका मतलब है कि इसमें एक मूल्य होना चाहिए

 dog = cow 

आवेदन क्रैश होगा क्योंकि हम अनलिमिटेड के लिए nil प्रदान करते हैं

इस मामले में…

var जॉन: व्यक्ति!

इसका मतलब है, कि शुरू में जॉन के पास शून्य मूल्य होगा, यह सेट हो जाएगा और एक बार सेट कभी नील के नेतृत्व में नहीं होगा। इसलिए सुविधा के लिए मैं एक वैकल्पिक वर्जन को एक्सेस करने के लिए आसान सिंटैक्स का उपयोग कर सकता हूं क्योंकि यह एक "अनपेक्षित रूप से अनपेक्षित वैकल्पिक"

यदि आप सी-कौटुंबिक भाषा से आए हैं, तो आप सोच रहे होंगे कि "टाइप एक्स के उद्देश्य के लिए सूचक जो मेमोरी एड्रेस 0 (NULL) हो सकता है", और अगर आप गतिशील रूप से टाइप की गई भाषा से आ रहे हैं तो आप सोच "ऑब्जेक्ट जो संभवतः टाइप एक्स की है लेकिन हो सकता है कि यह निश्चित न हो" इन में से कोई भी वास्तव में सही नहीं है, हालांकि एक चौराहे के रास्ते में पहले एक करीब है।

जिस तरह से आपको इसके बारे में सोचना चाहिए, जैसे कि यह एक वस्तु है:

 struct Optional<T> { var isNil:Boolean var realObject:T } 

जब आप foo == nil साथ अपने वैकल्पिक मान का परीक्षण कर रहे हैं तो यह वास्तव में foo.isNil लौट foo.isNil , और जब आप foo! कहते हैं foo! यह एक foo.realObject साथ foo.realObject लौट रहा है कि foo.isNil == false । यह ध्यान रखना ज़रूरी है क्योंकि अगर आप foo तो foo वास्तव में शून्य है foo! , यह एक रनटाइम त्रुटि है, इसलिए आम तौर पर आप एक सशर्त का उपयोग करना चाहते हैं, जब तक कि आप निश्चित न हों कि मूल्य शून्य नहीं होगा इस प्रकार की प्रलोभन का मतलब है कि भाषा को आप बिना परीक्षण किए मजबूती से टाइप कर सकते हैं यदि मूल्य हर जगह शून्य नहीं है।

व्यवहार में, यह वास्तव में ऐसा व्यवहार नहीं करता है क्योंकि काम कंपाइलर द्वारा किया जाता है एक उच्च स्तर पर एक प्रकार का Foo? जो Foo से अलग है, और जो फिक्स को स्वीकार करते हैं जो Foo को एक निल मान प्राप्त करने से स्वीकार करते हैं, लेकिन कम स्तर पर एक वैकल्पिक मान सही वस्तु नहीं है क्योंकि इसमें कोई गुण या विधियां नहीं हैं; यह संभावना है कि वास्तव में यह एक संकेतक है, जो उचित परीक्षा के साथ शून्य (0) से हो सकता है जब बल-अटपिंग हो।

वहां ऐसी कोई अन्य स्थिति है जिसमें आपको एक विस्मयादिबोधक चिह्न दिखाई दे रहा है, जैसे:

 func foo(bar: String!) { print(bar) } 

यह मोटे तौर पर मजबूर सलाखों के साथ वैकल्पिक को स्वीकार करने के बराबर है, यानी:

 func foo(bar: String?) { print(bar!) } 

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

कोई मूल्य के साथ उद्देश्य सी चर में 'शून्य' (यह शून्य और शून्य के समान 'शून्य' मानों का उपयोग करना संभव था) के बराबर था, इसलिए सशर्त बयान में वेरिएबल का उपयोग करना संभव था (मान वाले वेरिएबल 'TRUE 'और जिनके साथ कोई मूल्य नहीं थे वे' FALSE 'के बराबर थे)।

स्विफ्ट 'वैकल्पिक मान' प्रदान करके प्रकार सुरक्षा प्रदान करता है यानी यह विभिन्न प्रकार के चर को निर्दिष्ट करने से गलतियों की त्रुटियों को रोकता है।

तो स्विफ्ट में, केवल बूलियन सशर्त बयान पर उपलब्ध कराए जा सकते हैं।

 var hw = "Hello World" 

यहां, भले ही 'एचडब्ल्यू' एक स्ट्रिंग है, इसका उपयोग उद्देश्य सी में जैसे एक बयान में नहीं किया जा सकता है।

 //This is an error if hw {..} 

इसके लिए इसे बनाने की जरूरत है,

 var nhw : String? = "Hello World" //This is correct if nhw {..} 

द! इसका अर्थ है कि आप बल को ऑब्जेक्ट खोलना चाहते हैं! इस प्रकार है। अधिक जानकारी एपल्स दस्तावेज़ीकरण में पाई जा सकती है, जो यहां पाई जा सकती है: https://developer.apple.com/library/ios/documentation/swift/conceptual/swift_Programming_Language/TheBasics.html

यदि आप सी # से परिचित हैं, तो यह ऐसे नलएबल प्रकारों की तरह है जिन्हें एक प्रश्न चिह्न का उपयोग करके भी घोषित किया जाता है:

 Person? thisPerson; 

और इस स्थिति में विस्मयादिबोधक चिह्न इस तरह से नल योग्य प्रकार की संपत्ति का उपयोग करने के बराबर है।

 thisPerson.Value 

द! किसी वस्तु के अंत में यह कहता है कि ऑब्जेक्ट एक वैकल्पिक है और अगर इसे अन्यथा कोई शून्य नहीं लौटा सकता है यह आमतौर पर त्रुटियों को छिपाने के लिए उपयोग किया जाता है जो अन्यथा प्रोग्राम को क्रैश करेगा।

संक्षेप में (!): आपके द्वारा एक वैरिएबल घोषित करने के बाद और आप निश्चित हैं कि वेरिएबल में कोई मान है।

 let assumedString: String! = "Some message..." let implicitString: String = assumedString 

अन्यथा आपको मूल्य देने के बाद हर बार ऐसा करना होगा …

 let possibleString: String? = "An optional string." let forcedString: String = possibleString! // requires an exclamation mark 

जॉन एक वैकल्पिक व्यक्ति है, जिसका अर्थ है कि वह मूल्य रख सकता है या शून्य नहीं हो सकता

 john.apartment = number73 

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

 john!.apartment = number73 

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

प्रलेखन में इस का उपयोग करने के लिए एक अच्छा उदाहरण शामिल है जहां कनवर्टेड नंबर एक वैकल्पिक है।

 if convertedNumber { println("\(possibleNumber) has an integer value of \(convertedNumber!)") } else { println("\(possibleNumber) could not be converted to an integer") } 

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

 var optionalExample: String? 

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

उम्मीद है कि मदद की

सरल शब्दों में

विस्मयादिबोधक चिह्न का उपयोग करना इंगित करता है कि वेरिएबल में गैर शून्य मान शामिल होना चाहिए (यह कभी भी शून्य नहीं होगा)

पूरी कहानी को वैकल्पिक वैर्स नामक स्विफ्ट की सुविधा के साथ शुरू होता है। ये वो वार्स हैं जिनके पास मूल्य हो सकता है या मूल्य नहीं हो सकता है। सामान्य गति में हमें एक वेरिएबल का उपयोग करने की अनुमति नहीं देता है जो आरंभिक नहीं है, क्योंकि इससे क्रैश या अप्रत्याशित कारण हो सकते हैं और बैकडोर्स के लिए सर्वर भी प्लेसहोल्डर हो सकता है। इस प्रकार, किसी वैरिएबल को घोषित करने के लिए, जिसका मूल्य शुरू में निर्धारित नहीं किया जाता है, हम '?' का उपयोग करते हैं जब इस तरह के एक वैरिएबल को घोषित किया जाता है, तो इसे कुछ अभिव्यक्ति के एक भाग के रूप में इस्तेमाल करने के लिए उपयोग करने से पहले उसे खोलना पड़ता है, खोलना एक ऑपरेशन होता है जिसके माध्यम से एक चर का मान पता चलता है यह ऑब्जेक्ट पर लागू होता है। अनजाने के बिना अगर आप उनका उपयोग करने का प्रयास करते हैं तो आपको समय की त्रुटि संकलित करनी होगी। एक वैरिएबल को खोलना, जो एक वैकल्पिक वेर है, विस्मयादिबोधक चिह्न "!" प्रयोग किया जाता है।

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

इस प्रकार प्रणाली जानता है कि यह चर जो "!" अभी वैकल्पिक है और इसका कोई मूल्य नहीं है लेकिन बाद में अपने जीवनकाल में एक मान प्राप्त होगा।

इस प्रकार विस्मयादिबोधक चिह्न के दो अलग-अलग उपयोग होते हैं, 1. एक वैरिएबल घोषित करने के लिए जो वैकल्पिक होगा और बाद में निश्चित रूप से मूल्य प्राप्त करेगा 2. एक ऐपिकेशनल में इसका उपयोग करने से पहले एक वैकल्पिक वैरिएबल खोलना।

विवरण के ऊपर बहुत अधिक तकनीकी सामग्री से बचा जाता है, मुझे उम्मीद है।

यदि आप इसे एक वैकल्पिक के रूप में प्रयोग करते हैं, तो यह वैकल्पिक को खोलता है और देखता है कि क्या कुछ है यदि आप इसे एक if-else कथन में उपयोग करते हैं तो NOT के लिए कोड है। उदाहरण के लिए,

 if (myNumber != 3){ // if myNumber is NOT 3 do whatever is inside these brackets. ) 

एक वैकल्पिक चर में कोई मूल्य हो सकता है या नहीं हो सकता है

मामला 1: var myVar:String? = "Something" var myVar:String? = "Something"

मामला 2: var myVar:String? = nil var myVar:String? = nil

अब अगर आप myVar से पूछें !, तो आप कम्पाइलर को एक मान वापस करने के लिए कह रहे हैं 1 अगर यह "Something"

2 के मामले में यह दुर्घटना होगा

मतलब! चिह्न कम्पाइलर को एक मान वापस करने के लिए बाध्य करेगा, भले ही वह वहां न हो। यही कारण है कि नाम फोर्स अन्वॉप्पींग

 Simple the Optional variable allows nil to be stored. var str : String? = nil str = "Data" To convert Optional to the Specific DataType, We unwrap the variable using the keyword "!" func get(message : String){ return } get(message : str!) // Unwapped to pass as String 

अपने आप से पूछो

  • प्रकार person? एक apartment सदस्य / संपत्ति है? या
  • क्या प्रकार के person पास apartment सदस्य / संपत्ति है?

यदि आप इस प्रश्न का उत्तर नहीं दे सकते हैं, तो पढ़ना जारी रखें:

समझने के लिए आपको जेनेरिक्स के सुपर-बुनियादी स्तर की समझ की आवश्यकता हो सकती है यहां देखें स्विफ्ट में कई चीजें जेनेरिक्स के जरिए लिखी गई हैं वैकल्पिक शामिल हैं

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

एक वैकल्पिक केवल 2 मामलों के साथ एक enum है

 enum Optional<T>{ case None case Some(T) } let x: String? = nil //actually means: let x = Optional<String>.None 

 let x :String? = "hello" //actually means: let x = Optional<String>.Some("hello") 

 var y = x! // actually means: switch x { case .Some(let value): y = value case .None: // Raise an exception } 

वैकल्पिक बाइंडिंग:

 let x:String? = something if let y = x { // do something with y } //Actually means: switch x{ case .Some(let y): print)(y) // or whatever else you like using case .None: break } 

जब आप var john: Person? कहते हैं var john: Person? आप वास्तव में इसका मतलब है:

 enum Optional<Person>{ case .None case .Some(Person) } 

क्या उपरोक्त एन्यूम में apartment नामक कोई संपत्ति है ? क्या आप इसे कहीं भी देख रहे हैं? यह बिल्कुल नहीं है ! हालांकि यदि आप इसे खोलना अर्थात् person! करते person! तो आप कर सकते हैं … हुड के नीचे क्या होता है: Optional<Person>.Some(Person(name: "John Appleseed"))


यदि आपने परिभाषित किया था कि var john: Person बजाय: var john: Person? तो आप के लिए अब जरूरत नहीं होती ! इस्तेमाल किया है, क्योंकि Person खुद apartment सदस्य है


क्यों का उपयोग करने पर एक भविष्य की चर्चा के रूप में ! खोलने के लिए कभी-कभी अनुशंसित नहीं होता है यह क्यू एंड ए देखें