मुझे लगता है कि यह बुरा सलाह bar?.doSomething()
से बचने के लिए और बदले में हमेशा if let bar = bar { ... }
का उपयोग है को लागू करने की तरह है।
दो मुख्य कारण हैं:
पहले, bar?.doSomething()
बस अधिक संक्षिप्त है। यदि आप सशर्त अभिव्यक्ति में केवल एक कथन के साथ if let
लिख रहे हैं तो आपको शायद खुद से पूछना चाहिए कि क्या आप उस कोड को छोटे संस्करण के साथ एक पंक्ति पर नहीं रखना चाहते हैं।
हालांकि यह पूरी तरह से कानूनी कोड है ..
if let thing = thing {
thing.bar()
}
.. निम्नलिखित सिर्फ कानूनी रूप, बस जो बहुत छोटी ..
thing?.bar()
दूसरा, और अधिक महत्वपूर्ण और के कोर करने के लिए है यह मुद्दा, वे वही नहीं हैं!if let
एक संयुक्त परीक्षण, वैकल्पिक अनैपिंग और असाइनमेंट है जबकि bar?
कुछ वैकल्पिक चेनिंग कहलाता है।
उत्तरार्द्ध कई मामलों में बहुत उपयोगी है जो आपको बहुत अच्छे कोड लिखने देता है। उदाहरण के लिए:
यह .. यह बदलने के लिए इस्तेमाल किया जा सकता ..
var imageGenerator: ImageGenerator?
if let generator = imageGenerator {
myView.image = generator.generateImage()
} else {
myView.image = nil
}
बस के साथ:
myView.image = self.imageGenerator?.generateImage()
इसका कारण वैकल्पिक श्रृंखलन रिटर्न nil
रूप में जल्द ही है क्योंकि यह चेन में nil
से मुकाबला करता है। और चूंकि UIImageView
में image: UIImage?
है, यह उस शून्य मूल्य को लेता है। यहां तक कि अगर यह एक ImageGenerator?
से आता है यह और भी अधिक उपयोगी जब शून्य वालों ऑपरेटर, ??
के साथ संयुक्त है।
अब आप इस कोड को बदल सकते हैं ..
var imageGenerator: ImageGenerator?
if let generator = imageGenerator {
myView.image = generator.generateImage()
} else {
myView.image = DefaultImage
}
.. में ..
myView.image = generator?.makeImageGenerator() ?? DefaultImage
.. जो जिस तरह से अधिक संक्षिप्त है।
और क्योंकि वैकल्पिक श्रृंखलनचेन पर काम करता है .. आप भी कुछ ऐसा कर सकते हैं:
myView.image = delegate?.makeImageGenerator()?.generateImage() ?? DefaultImage
कौन सा बन जाएगा ..
if let delegate = delegate {
if let generator = delegate.generatorForImage() {
if let image = generator.generateImage() {
myView.image = image
} else {
myView.image = DefaultImage
}
} else {
myView.image = DefaultImage
}
} else {
myView.image = DefaultImage
}
.. आप का उपयोग नहीं किया है, तो वैकल्पिक चेनिंग और नील कोलेसिंग ऑपरेटर।
(हाँ myView.image = DefaultImage
अंत में ही सशर्त किया जा सकता है, लेकिन इसका मतलब है कि आप अभी भी अगर यह स्थापित किया गया था जांच करने के लिए अतिरिक्त कोड लागू करने के लिए की है। यह बहुत कम हो नहीं होते।)
वहाँ दो नए गुर :-)
अंगूठे का नियम: हर बार जब आप '!' लिखने से बच सकते हैं, ऐसा करें ('बूल' को अस्वीकार करने के अलावा)। इसमें उदा। मजबूर डाउनकास्ट 'के रूप में!'। '!' का मतलब है 'हे! ऐसा मत करो! यह खतरनाक है! मैंने आपको चेतावनी दी! ' –
'! 'का अर्थ है' मुझे पता है कि मैं वास्तव में क्या कर रहा हूं! मैं डेवलपर हूं और मैं तय करता हूं कि मेरा प्रोग्राम कैसे चलाना चाहिए! यह तय करने के लिए कुछ चरम पर निर्भर नहीं है कि कोई विधि कहलायी जानी चाहिए! मेरी राय में उद्देश्य-सी डेवलपर्स '? 'का उपयोग करते हैं। यदि आप वैकल्पिक चेन चीजें एक साथ वैकल्पिक नहीं हैं (सॉफ़्टवेयर डिज़ाइन बिंदु दृश्य से) आप उद्देश्य-सी से मित्रवत शून्य को अनुकरण कर रहे हैं। –
@ माथियास बॉच '! 'का अर्थ है' मैं डेवलपर हूं और मैं कभी गलती नहीं करता! मेरा कार्यक्रम हमेशा ठीक तरह से चलता है! मैंने फैसला किया! ' मेरी राय में '!' का अर्थ है 'यह कभी भी शून्य नहीं होना चाहिए, अगर ऐसा नहीं होता है तो जारी रखें।' – Krzak