स्विफ्ट में "पूर्वगामी" और "मुखर" के बीच अंतर?


105

बीच क्या अंतर है precondition(condition: Bool, message: String)और assert(condition: Bool, message: String)स्विफ्ट में?

दोनों मुझे एक जैसे लगते हैं। हमें किस संदर्भ में एक का उपयोग करना चाहिए?

जवाबों:


125

assertपरीक्षण के दौरान पवित्रता की जाँच के लिए है, जबकि preconditionउन चीजों से रक्षा करने के लिए है, यदि वे होते हैं, तो इसका मतलब होगा कि आपका कार्यक्रम सिर्फ यथोचित रूप से आगे नहीं बढ़ सकता है।

इसलिए, उदाहरण के लिए, assertयदि आप बग है, तो जल्दी से खोजने के लिए आप कुछ गणना समझदार परिणामों (कुछ सीमा के भीतर) पर रख सकते हैं । लेकिन आप इसके साथ शिप नहीं करना चाहेंगे, क्योंकि आउट-ऑफ-बाउंड परिणाम मान्य हो सकता है, और महत्वपूर्ण नहीं है इसलिए आपके ऐप को क्रैश नहीं करना चाहिए (मान लीजिए कि आप इसका उपयोग प्रगति पट्टी में प्रगति प्रदर्शित करने के लिए कर रहे थे)।

दूसरी ओर, यह जांचना कि किसी तत्व को लाने पर किसी सरणी पर एक सबस्क्रिप्ट मान्य है precondition। किसी अमान्य सबस्क्रिप्ट के लिए पूछे जाने पर सरणी ऑब्जेक्ट के लिए कोई उचित अगली कार्रवाई नहीं है, क्योंकि इसे एक गैर-वैकल्पिक मान वापस करना होगा

डॉक्स से पूर्ण पाठ (विकल्प पर क्लिक करें assertऔर preconditionXcode में):

शर्त लगाना

आगे की प्रगति करने के लिए एक आवश्यक शर्त की जाँच करें।

इस फ़ंक्शन का उपयोग उन परिस्थितियों का पता लगाने के लिए करें जो प्रोग्राम को शिपिंग कोड में भी आगे बढ़ने से रोकना चाहिए।

  • खेल के मैदानों और -ऑन बिल्ड में (Xcode के डिबग कॉन्फ़िगरेशन के लिए डिफ़ॉल्ट): यदि conditionमुद्रण के बाद डीबग करने योग्य स्थिति में गलत, प्रोग्राम निष्पादन को रोकें message

  • In -O बनाता है (Xcode की रिलीज़ कॉन्फ़िगरेशन के लिए डिफ़ॉल्ट): यदि conditionगलत का मूल्यांकन करता है, तो प्रोग्राम निष्पादन रोकें।

  • In -unchecked बनाता है, conditionका मूल्यांकन नहीं किया जाता है, लेकिन ऑप्टिमाइज़र मान सकता है कि यह मूल्यांकन करेगाtrue । उस धारणा को संतुष्ट करने में विफलता-अनियंत्रित बिल्ड एक गंभीर प्रोग्रामिंग त्रुटि है।

ज़ोर

एक वैकल्पिक संदेश के साथ पारंपरिक सी-शैली मुखर।

आंतरिक स्वच्छता जांच के लिए इस फ़ंक्शन का उपयोग करें जो परीक्षण के दौरान सक्रिय हैं लेकिन शिपिंग कोड के प्रदर्शन को प्रभावित नहीं करते हैं। रिलीज़ बिल्ड में अमान्य उपयोग की जांच करने के लिए; देखते हैं precondition

  • खेल के मैदानों और -ऑन बिल्ड में (Xcode के डिबग कॉन्फ़िगरेशन के लिए डिफ़ॉल्ट): यदि conditionमुद्रण के बाद डीबग करने योग्य स्थिति में गलत, प्रोग्राम निष्पादन को रोकें message

  • In -O बनाता है (Xcode की रिलीज़ कॉन्फ़िगरेशन के लिए डिफ़ॉल्ट), conditionमूल्यांकन नहीं किया गया है, और कोई प्रभाव नहीं हैं।

  • In -unchecked बनाता है, conditionका मूल्यांकन नहीं किया जाता है, लेकिन ऑप्टिमाइज़र मान सकता है कि यह मूल्यांकन करेगाtrue । उस धारणा को संतुष्ट करने में विफलता-अनियंत्रित बिल्ड एक गंभीर प्रोग्रामिंग त्रुटि है।


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

2
आपके प्रश्न का उत्तर देते हुए, मैं व्यक्तिगत रूप से उन चीजों को पकड़ने के लिए जोर लगाता हूं जो मेरे निर्माण में नहीं होनी चाहिए जबकि मैं इसे लिख रहा हूं और इसका परीक्षण कर रहा हूं। एक गार्ड स्टेटमेंट की कल्पना करें जो JSON पढ़ रहा है जहां data["name"]मौजूद नहीं है, लेकिन यह होना चाहिए। पहरेदार के अंदर मुखर होने से..से {} मुझे दुर्घटनाग्रस्त करके और समस्या को लाकर मेरी त्रुटि को पकड़ने में मदद करेगा। इसी तरह, यदि यह कोड उत्पादन में था, तो अभिकर्ता प्रोग्राम को क्रैश नहीं करेगा, और जो भी बैकअप कोड मैंने इस्तेमाल किया है ( return nil) उसे संभाल लेगा।
एलेक ओ

1
क्या आपको पूरे ऐप को क्रैश करने के बजाय इंडेक्स की जांच नहीं करनी चाहिए और कुछ भी नहीं करना चाहिए?
इयूलियन ओनोफ्रेई

हां, आपको इंडेक्स की जांच करनी चाहिए, लेकिन हर कोई कभी-कभी फिसल जाता है, और एसेर्ट्स का उपयोग करने से आपको यह महसूस करने में मदद मिलती है कि आपको इंडेक्स की जांच करनी चाहिए जब आप भूल गए थे।
विक्टर एंगेल

"लेकिन आप इसके साथ जहाज नहीं करना चाहेंगे, क्योंकि आउट-ऑफ-बाउंड परिणाम मान्य हो सकता है, और महत्वपूर्ण नहीं है ताकि आपके ऐप को क्रैश न करें"। आप अपने ऐप को जितने चाहें उतने जोर के साथ शिप कर सकते हैं। स्विफ्ट सिर्फ रिलीज़ ऐप में दावे ब्लॉक के अंदर आपकी स्थितियों का मूल्यांकन नहीं करेगा
आकाश ठाकुर

90

मैंने पाया स्विफ्ट मुखर - उपयोगी होने के लिए लापता मैनुअल

                        debug   release   release
function                -Onone  -O       -Ounchecked
assert()                YES     NO        NO
assertionFailure()      YES     NO        NO**
precondition()          YES     YES       NO
preconditionFailure()   YES     YES       YES**
fatalError()*           YES     YES       YES

और स्विफ्ट इवोल्यूशन पर दिलचस्प चर्चा से

- जोर: आंतरिक त्रुटियों के लिए अपने स्वयं के कोड की जाँच

- पूर्व शर्त: यह जाँचने के लिए कि आपके ग्राहकों ने आपको मान्य तर्क दिए हैं।

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


क्या आप स्वयं के कोड और क्लाइंट के अंतर के बारे में विस्तार से बता सकते हैं? क्लाइंट के लिए क्या आपके पास संख्या डालने की तरह मतलब है जहां एक स्ट्रिंग की उम्मीद है? कि कुछ सरल त्रुटि से निपटने के साथ इलाज नहीं किया जाना चाहिए?
शहद

@ मुझे लगता है कि वह नेटवर्क एपीआई कॉलिंग, या क्लाइंट के अपने प्लगइन्स से तर्क / परिणाम के बारे में है।
चेन ली योंग

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

@ onmyway133: Xcode QuickHelp से, मुझे लगता है precondition()और एक ही व्यवहार करpreconditionFailure() रहे हैं । इन कार्यों के बीच का अंतर है: अंदर एक शर्त की जरूरत है, जबकि सिर्फ बाहर फेंकना है। preconditionpreconditionFailure
नाहुंग 'n

12

preconditionताकि आप को रिलीज़ मोड में सक्रिय होता है जब आप अपने अनुप्रयोग जहाज और पूर्व शर्त विफल रही एप्लिकेशन को समाप्त कर देगा। Assertडिफ़ॉल्ट रूप में डिबग मोड में काम करता है।

NSHipster पर इसका उपयोग करने पर मुझे यह बहुत अच्छा लगा।

निबंध शास्त्रीय तर्क से उधार ली गई अवधारणा है। तर्क में, दावे एक सबूत के भीतर प्रस्तावों के बारे में बयान हैं। प्रोग्रामिंग में, मान्यताओं का अनुमान है कि प्रोग्रामर ने उस स्थान पर आवेदन के बारे में कहा है जहां उन्हें घोषित किया गया है।

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


संकलक ध्वज का उपयोग करके अभिक्रियाओं को सक्षम और अक्षम किया जा सकता है; वे शिप कोड में सक्रिय हो सकते हैं।
पेतुर इंगि एगिल्सन

6

शर्त लगाना

func precondition(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)

आगे की प्रगति करने के लिए एक आवश्यक शर्त की जाँच करें।

  1. इस फ़ंक्शन का उपयोग उन परिस्थितियों का पता लगाने के लिए करें जो प्रोग्राम को शिपिंग कोड में भी आगे बढ़ने से रोकना चाहिए।
  2. खेल के मैदानों में और -ऑन बिल्ड (Xcode के डिबग कॉन्फ़िगरेशन के लिए डिफ़ॉल्ट): यदि स्थिति झूठी का मूल्यांकन करती है, तो मुद्रण संदेश के बाद डीबग करने योग्य स्थिति में प्रोग्राम निष्पादन रोकें।
  3. In -O बनाता है (Xcode की रिलीज़ कॉन्फ़िगरेशन के लिए डिफ़ॉल्ट): यदि स्थिति झूठी का मूल्यांकन करती है, तो प्रोग्राम निष्पादन रोकें।
  4. In -unchecked बनाता है, स्थिति का मूल्यांकन नहीं किया जाता है, लेकिन ऑप्टिमाइज़र मान सकता है कि यह सत्य का मूल्यांकन करेगा। उस धारणा को संतुष्ट करने में विफलता-अनियंत्रित बिल्ड एक गंभीर प्रोग्रामिंग त्रुटि है।

ज़ोर

func assert(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)

एक वैकल्पिक संदेश के साथ पारंपरिक सी-शैली मुखर।

  1. आंतरिक स्वच्छता जांच के लिए इस फ़ंक्शन का उपयोग करें जो परीक्षण के दौरान सक्रिय हैं लेकिन शिपिंग कोड के प्रदर्शन को प्रभावित नहीं करते हैं। रिलीज़ बिल्ड में अमान्य उपयोग की जांच करने के लिए; पूर्वदर्शन देखें।

  2. खेल के मैदानों में और -ऑन बिल्ड (Xcode के डिबग कॉन्फ़िगरेशन के लिए डिफ़ॉल्ट): यदि स्थिति झूठी का मूल्यांकन करती है, तो मुद्रण संदेश के बाद डीबग करने योग्य स्थिति में प्रोग्राम निष्पादन रोकें।

  3. In -O बनाता है (Xcode की रिलीज़ कॉन्फ़िगरेशन के लिए डिफ़ॉल्ट), स्थिति का मूल्यांकन नहीं किया जाता है, और कोई प्रभाव नहीं होता है
  4. In -unchecked बनाता है, स्थिति का मूल्यांकन नहीं किया जाता है, लेकिन ऑप्टिमाइज़र मान सकता है कि यह सच का मूल्यांकन करेगा। उस धारणा को संतुष्ट करने में विफलता-अनियंत्रित बिल्ड एक गंभीर प्रोग्रामिंग इर्रो है

0

बस मैं अपने 2 सेंट जोड़ना चाहता था। आप अपने कोड में जितने चाहें उतने जोड़ सकते हैं। आप इन कयासों के साथ अपना कोड शिप कर सकते हैं। स्विफ्ट उत्पादन कोड के लिए इन कोड ब्लॉक का मूल्यांकन नहीं करता है। इनका मूल्यांकन केवल डिबग मोड के मामले में किया जाता है।

प्रलेखन लिंक जोड़ना

इसके अलावा स्विफ्ट.ओआरजी से इमेज अटैच करना

यहां छवि विवरण दर्ज करें

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

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

तथा

PreConditions सुनिश्चित करने के लिए हैं कि अप्रत्याशित चीजें उत्पादन पर्यावरण पर नहीं होती हैं। उन स्थितियों का मूल्यांकन किया जाता है और झूठे होने के लिए उनका मूल्यांकन करने पर आपके ऐप को समाप्त कर दिया जाएगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.