""? (प्रश्न चिह्न) और "!" (विस्मयादिबोधक चिह्न)


106

मैं समझता हूं कि स्विफ्ट में सभी वेरिएबल्स को एक मूल्य के साथ सेट किया जाना चाहिए, और वैकल्पिक का उपयोग करके हम nilशुरू में सेट होने के लिए एक चर सेट कर सकते हैं ।

मुझे समझ में नहीं आ रहा है, एक के साथ एक चर की स्थापना क्या !कर रही है, क्योंकि मैं इस धारणा के तहत था कि यह "वैकल्पिक" को एक वैकल्पिक से हटा देता है। मैंने सोचा कि ऐसा करने से, आप गारंटी दे रहे हैं कि उस चर को खोलना एक मूल्य है, यही कारण है कि IBActions और इस तरह से आप इसका इस्तेमाल करते हैं।

तो सीधे शब्दों में कहें, जब आप इस तरह से कुछ करते हैं तो वैरिएबल को इनिशियलाइज़ किया जाता है:

var aShape : CAShapeLayer!

और क्यों / मैं ऐसा कब करूंगा?


आप यह बताने के लिए ऐसा करेंगे कि इस तथ्य की जाँच करने के बाद एक चर nt nil हो
मथायस

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

@ जियारो उस मामले में भी, वैकल्पिक के बारे में पहले से ही कई सवाल हैं, संक्षेप में अलिखित वैकल्पिक, और पसंद है। आप इसे भी देख सकते हैं: stackoverflow.com/questions/24272781/…
जैक

@JackWu ठीक है, लेकिन मुझे पूरा यकीन है कि जब यह पूछा गया था तो यह सवाल डुप्लिकेट नहीं था। (यह आपके उदाहरण से पहले एक पूरे हफ्ते पूछा गया था, उदाहरण के लिए)
जियारो

@ जियारो आप एक अच्छा बिंदु बनाते हैं, मैंने नोटिस नहीं किया था कि यह अधिक पुराना था..क्योंकि अन्य को इसके बजाय डुप्लिकेट के रूप में चिह्नित किया जाना चाहिए ..
जैक

जवाबों:


145

एक प्रकार की घोषणा में !यह समान है ?। दोनों एक वैकल्पिक हैं, लेकिन !एक " अंतर्निहित रूप से अपरिवर्तित" वैकल्पिक है , जिसका अर्थ है कि आपको मूल्य तक पहुंचने के लिए इसे खोलना नहीं है (लेकिन यह अभी भी शून्य हो सकता है)।

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

// Cannot be nil
var x: Int = 1

// The type here is not "Int", it's "Optional Int"
var y: Int? = 2

// The type here is "Implicitly Unwrapped Optional Int"
var z: Int! = 3

उपयोग:

// you can add x and z
x + z == 4

// ...but not x and y, because y needs to be unwrapped
x + y // error

// to add x and y you need to do:
x + y!

// but you *should* do this:
if let y_val = y {
    x + y_val
}

7
द अन स्विफ्ट प्रोग्रामिंग लैंग्वेज के पेज 56 पर शुरू होने वाले एक सेक्शन नाम के सेक्शन में इम्प्लांटली अनकैप्ड अल्टरनेटिव्स दिए गए हैं ।
कालेब

@ कालेब मैंने ऑनलाइन डॉक्स के संबंधित अनुभाग के लिए एक लिंक जोड़ा है जहां मैंने स्पष्ट रूप से
अलिखित

बढ़िया जानकारी, धन्यवाद। आम तौर पर उस सुरक्षा से प्यार करना जो स्विफ्ट हमें अब तक मजबूर कर रही है, बहुत कम कीड़े पैदा करना चाहिए :)।
जेसन रेनाल्डो

@ जियारो: साझा करने के लिए बहुत बहुत धन्यवाद। यह उपर्युक्त उदाहरण से उपयोगकर्ता को पूरी तरह से समझने के लिए बनाता है। !! :)
एशा

3
मुझे लगता है कि वाक्य " यह मूल रूप से व्यवहार जो हम पहले से ही उद्देश्य-सी में था " भ्रामक हो सकता है। वस्तुनिष्ठ-ग में एक nilमान का उपयोग कर सकता है और वास्तव में इसके साथ "काम" कर सकता है, तेजी से एक अनुमानित रूप से अलिखित वैकल्पिक तक पहुंच में, जबकि यह शून्य रनटाइम अपवाद को फेंक देगा
साशा वुल्फ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.