गार्ड स्पष्टता में सुधार कर सकते हैं
जब आप की रक्षा आप एक बहुत का उपयोग उच्च गार्ड के लिए प्रत्याशा सफल होने और यह कुछ हद तक महत्वपूर्ण है कि अगर यह सफल नहीं होता है, तो आप सिर्फ बाहर निकलने के दायरे करना चाहते हैं जल्दी । जैसे आप यह देखने के लिए पहरा देते हैं कि कोई फ़ाइल / छवि मौजूद है, यदि कोई सरणी खाली है या नहीं।
func icon() -> UIImage {
guard let image = UIImage(named: "Photo") else {
return UIImage(named: "Default")! //This is your fallback
}
return image //-----------------you're always expecting/hoping this to happen
}
यदि आप उपरोक्त कोड को if-let के साथ लिखते हैं तो यह पढ़ने वाले डेवलपर को बताता है कि यह 50-50 से अधिक है। लेकिन अगर आप गार्ड का उपयोग करते हैं तो आप अपने कोड में स्पष्टता जोड़ते हैं और इसका मतलब है कि मैं इस समय के 95% काम करने की उम्मीद करता हूं ... अगर यह कभी विफल रहा, तो मुझे नहीं पता कि यह क्यों होगा; यह बहुत संभावना नहीं है ... लेकिन इसके बजाय इस डिफ़ॉल्ट छवि का उपयोग करें या शायद सिर्फ एक सार्थक संदेश के साथ दावा करें कि क्या गलत हुआ!
guardजब वे दुष्प्रभाव पैदा करते हैं, तो गार्ड से बचने के लिए प्राकृतिक प्रवाह के रूप में उपयोग किया जाना चाहिए । जब गार्ड elseसाइड इफेक्ट का परिचय देते हैं तो गार्ड से बचें । गार्ड जल्दी ठीक होने की पेशकश करने के लिए कोड को ठीक से निष्पादित करने के लिए आवश्यक शर्तें स्थापित करते हैं
जब आप सकारात्मक शाखा में महत्वपूर्ण गणना करते हैं, तो ifएक guardबयान से प्रतिक्षेपक और elseक्लॉज में फ़ॉलबैक मान लौटाता है
प्रेषक: एरिका सदुन की स्विफ्ट स्टाइल पुस्तक
उपरोक्त सुझावों और स्वच्छ कोड के परिणामस्वरूप, यह अधिक संभावना है कि आप चाहते हैं / असफल गार्ड बयानों में जोर जोड़ने की आवश्यकता होगी , यह सिर्फ पठनीयता में सुधार करता है और अन्य डेवलपर्स के लिए यह स्पष्ट करता है कि आप क्या उम्मीद कर रहे थे।
guard let image = UIImage(named: selectedImageName) else { // YESSSSSS
assertionFailure("Missing \(selectedImageName) asset")
return
}
guard let image = UIImage(named: selectedImageName) else { // NOOOOOOO
return
}
प्रेषक: एरिका सदुन की स्विफ्ट शैली की किताब + कुछ संशोधन
(आप if-letएस के लिए जोर / पूर्व शर्त का उपयोग नहीं करेंगे । यह सिर्फ सही नहीं लगता है)
गार्ड का उपयोग करना आपको कयामत के पिरामिड से बचने के लिए स्पष्टता में सुधार करने में भी मदद करता है । देखें नितिन का जवाब ।
गार्ड एक नया चर बनाता है
एक महत्वपूर्ण अंतर यह है कि मेरा मानना है कि किसी ने अच्छी तरह से समझाया नहीं है।
दोनों guard letऔर हालांकि चर को if let खोलना
साथ guard letआप बना रहे हैं एक नया वेरिएबल कि मौजूद बाहर elseबयान।
साथ if letआप नहीं बना रहे हैं किसी भी नए चर के बाद किसी और बयान, आप केवल प्रवेश कोड ब्लॉक करता है, तो वैकल्पिक गैर शून्य होता है। नव निर्मित चर कोड ब्लॉक के अंदर ही मौजूद है , उसके बाद नहीं!
guard let:
func someFunc(blog: String?) {
guard let blogName = blog else {
print("some ErrorMessage")
print(blogName) // will create an error Because blogName isn't defined yet
return
}
print(blogName) // You can access it here ie AFTER the guard statement!!
//And if I decided to do 'another' guard let with the same name ie 'blogName' then I would create an error!
guard let blogName = blog else { // errorLine: Definition Conflicts with previous value.
print(" Some errorMessage")
return
}
print(blogName)
}
if-let:
func someFunc(blog: String?) {
if let blogName1 = blog {
print(blogName1) // You can only access it inside the code block. Outside code block it doesn't exist!
}
if let blogName1 = blog { // No Error at this line! Because blogName only exists inside the code block ie {}
print(blogName1)
}
}
अधिक जानकारी के if letलिए देखें: वैकल्पिक बाध्यकारी के पुनर्वितरण में त्रुटि क्यों नहीं होती है
गार्ड को गुंजाइश बाहर निकलने की आवश्यकता है
(रोब नेपियर के उत्तर में भी उल्लेख किया गया है):
आपने एक फंक के अंदरguard परिभाषित किया होगा । यदि कोई शर्त पूरी नहीं हुई तो इसका मुख्य उद्देश्य / वापसी / निकास गुंजाइश को रोकना है :
var str : String?
guard let blogName1 = str else {
print("some error")
return // Error: Return invalid outside of a func
}
print (blogName1)
के लिए if letआप किसी भी समारोह के अंदर यह करने की जरूरत नहीं है:
var str : String?
if let blogName1 = str {
print(blogName1) // You don't get any errors!
}
guard बनाम if
यह ध्यान देने योग्य है कि इस प्रश्न को guard letबनाम if letऔर guardबनाम के रूप में देखना अधिक उपयुक्त है if।
एक स्टैंडअलोन ifकिसी भी अलौकिक नहीं करता है, न ही एक स्टैंडअलोन करता है guard। नीचे उदाहरण देखें। यदि मूल्य है तो यह जल्दी बाहर नहीं निकलता है nil। कोई वैकल्पिक मूल्य नहीं हैं। यदि कोई शर्त पूरी नहीं हुई तो यह जल्दी बाहर निकल जाता है।
let array = ["a", "b", "c"]
func subscript(at index: Int) -> String?{
guard index > 0, index < array.count else { return nil} // exit early with bad index
return array[index]
}
if letजबnon-nilमामला वैध हो तब उपयोग करें ।guardजबnilमामला किसी प्रकार की त्रुटि का प्रतिनिधित्व करता है तो उपयोग करें ।