2016-08-15 11 views
6

मैं कोड ब्लॉक या 'स्कोप' की परिभाषा के बारे में उलझन में हूं। गार्ड के लिए ऐप्पल दस्तावेज़ यह कहते हैं: एक गार्ड स्टेटमेंट का अन्य ब्लॉक ...अगर स्विफ्ट 'गार्ड' कथन को दायरे से बाहर निकलना चाहिए, तो दायरे की परिभाषा क्या है?

"कोड ब्लॉक से बाहर निकलने के लिए नियंत्रण स्थानांतरित करना होगा जिसमें गार्ड स्टेटमेंट दिखाई देता है।"

अन्य online sources कहता है कि गार्ड स्टेटमेंट में 'स्कोप' मौजूद होना चाहिए जिसमें यह मौजूद है। 'विषय-क्षेत्र' के अपने वर्तमान समझ, कोड

if y == 2 {....} 

एक नया गुंजाइश बनाता है, अर्थात् के बीच {} के अनुसार

func testGuardControlFlow() { 

let x = 2 
let y = 2 

    func embededFunc() { 

     if y == 2 { 

      guard x == 1 else { 
       print("oops, number is not 1") 
       return 
      } 

      print ("from in embededFunc") 

     } 

     print ("I still want this to print even if x != 1") 
    } 

    embededFunc() 
    print("Great, return still allows this to be printed.") 

} 

testGuardControlFlow() 

:

तो नीचे दिए गए उदाहरण कोड ले। और इस धारणा को देखते हुए, गार्ड केवल उस दायरे से बच जाएगा। लेकिन मामला वह नहीं है। इस उदाहरण में गार्ड उस समारोह से बच निकलता है, भले ही इसे किसी खंड में दफनाया गया हो।

क्या मैं पूरी तरह से गलत समझ रहा हूं कि 'स्कोप' का क्या अर्थ है? क्या किसी विधि में कोड का मतलब है? यदि हां, तो 'स्पेस' के लिए सही शब्द क्या है जो किसी कथन के भीतर मौजूद है?

+0

आवश्यकता यह है कि अन्य खंड वर्तमान दायरे को छोड़ देता है। 'वापसी' पूरे कार्य को छोड़कर आवश्यकता को पूरा करती है जो निश्चित रूप से वर्तमान दायरे को छोड़ देती है। अन्य खंड में 'वापसी' का उपयोग करना आवश्यक नहीं है। अन्य चीजें काम जारी रखेगी, जैसे 'जारी रखें'। – vacawama

उत्तर

14

यह आपके द्वारा कल्पना की जाने वाली पूरी तरह से संभव है, यह ऐसा नहीं होता है कि वह विशेष कोड क्या न हो। return हमेशा एक विधि से बाहर निकलता है, न कि स्थानीय दायरे। आप क्या चाहते हैं करने के लिए, आप एक लेबल का उपयोग कर सकते हैं, और break:

func testGuardControlFlow() { 

    let x = 2 
    let y = 2 

    func embededFunc() { 

     breakLabel: 
     if y == 2 { 

      guard x == 1 else { 
       print("oops, number is not 1") 
       break breakLabel 
      } 

      print ("from in embededFunc") 

     } 

     print ("I still want this to print even if x != 1") 
    } 

    embededFunc() 
    print("Great, return still allows this to be printed.") 

} 

testGuardControlFlow() 

vadian's answer करने पर जोड़ने के लिए:

guard बलों आप एक नियंत्रण हस्तांतरण कथन का उपयोग दायरे से बाहर निकलने के। वहाँ 4 उपलब्ध हैं आप के लिए:

  • return और throw दोनों बाहर निकलने के समारोह/विधि
  • continue छोरों (while/for/repeat-while)
  • break छोरों में इस्तेमाल किया जा सकता भीतर इस्तेमाल किया जा सकता (while/तत्काल दायरे से बाहर निकलने के लिए for/repeat-while)। ब्रेक करने के लिए एक लेबल निर्दिष्ट करने से आप एक साथ कई स्कॉप्स से बाहर निकलने की अनुमति देंगे (जैसे नेस्टेड लूप संरचना से बाहर तोड़ना)। लेबल का उपयोग करते समय, break का उपयोग if स्कॉप्स में भी किया जा सकता है।

इसके अतिरिक्त, आप Never जैसे fatalError लौटने वाले फ़ंक्शन को कॉल करके दायरे से बाहर निकल सकते हैं।

+0

समझ गया। धन्यवाद! –

+0

मैं उल्लेख करना भूल गया * क्यों * आपको 'if' से तोड़ने के लिए एक लेबल की आवश्यकता है। एक लूप से सशर्त रूप से तोड़ना चाहते हैं यह वास्तव में आम है। 'If' से 'ब्रेक' करना चाहते हैं, यह निश्चित रूप से अधिक आम है। इस प्रकार, 'if' कथन के भीतर' ब्रेक 'निकटतम लूप स्कोप को तोड़ने के लिए डिफ़ॉल्ट है। अन्य व्यवहार लेबल को स्पष्ट रूप से निर्दिष्ट करने से आता है। – Alexander

+0

@Alexander - बस पुष्टि करना चाहते हैं - बंद होने के दौरान उपयोग किए जाने पर यह कैसे काम करता है? क्या यह बंद या कार्य से बाहर निकलता है जिसके अंदर बंद किया जाता है? –

0

आप डॉक्टर के कहने के बारे में गलत व्याख्या कर रहे हैं। गार्ड स्टेटमेंट स्वयं किसी भी दायरे से बाहर नहीं निकलता है। आपको गार्ड स्टेटमेंट के दायरे से बाहर निकलने वाले गार्ड स्टेटमेंट के अंदर कुछ कथन लिखना होगा।

वापसी दायरे से बाहर निकल जाएगी। एक लूप में, ब्रेक या जारी रखें दायरे से बाहर निकलेंगे। कई मामलों में, गोटो स्टॉप से ​​बाहर निकल जाएगा। यदि किसी कथन के दायरे से बाहर निकलने के लिए कोई विशिष्ट कथन नहीं है, तो आपको एक गेटो स्टेटमेंट या लूप या फ़ंक्शन से जुड़े फ़ंक्शन से बाहर निकलने की आवश्यकता होगी।

+1

'अगर किसी कथन के दायरे से बाहर निकलने के लिए कोई विशिष्ट कथन नहीं है, तो 'ब्रेक' कर सकते हैं। 'तो आपको एक गोटो स्टेटमेंट की आवश्यकता होगी' स्विफ्ट में 'गोटो' नहीं है, लेकिन यह आवश्यक नहीं है, वैसे भी, क्योंकि 'ब्रेक' अनिवार्य रूप से वही है। – Alexander

2

शब्द स्कोप की आपकी समझ बिल्कुल सही है। असल में यह दो (संतुलित) ब्रेसिज़ के बीच की जगह है।

प्रलेखन में कोड ब्लॉक से बाहर निकलने के लिए विवरण विवरण सबसे सटीक है।

एक guard बयान आप नियंत्रण हस्तांतरण बयान return, break, continue, या throw उपयोग कर सकते हैं बाहर निकलने के लिए।

  • return और throw पूरे फ़ंक्शन या विधि से बाहर निकलता है।
  • continue और break वर्तमान दायरे से बाहर निकलता है (उदाहरण के लिए switch, for या while)।
संबंधित मुद्दे