swift - भाई और बहन के बीच संपत्ति विवाद




गणना के साथ गणना की गई संपत्ति और संपत्ति के बीच अंतर (3)

बंद:

  //closure
    var pushBehavior: UIPushBehavior = {
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }()

पहली बार जब pushBehavior वैरिएबल कहा जाता है, तब block execute और value pushBehavior वैरिएबल में सेव हो जाती है। उसके बाद जब भी आप पुशबीवर कहते हैं तो उन मानों को वापस कर दिया जाता है।

इसका अर्थ है कि केवल पहली बार ब्लॉक कोड को इस वेरिएबल में निष्पादित और सहेजा गया है। इसके अलावा, आप जब चाहें तब वैरिएबल वैल्यू स्टोर कर सकते हैं लेकिन उसके बाद, वे वैल्यू वापस आ जाते हैं लेकिन अगर आप "लेट" घोषित करते हैं तो आप इस वैल्यू को बदल नहीं सकते हैं।

गणना की गई संपत्ति:

var pushBehavior: UIPushBehavior {
    get{
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }
}

गणना की गई संपत्ति में जब भी आप पुशबीवर चर कहते हैं तो यह ब्लॉक निष्पादित और मूल्य वापसी करता है। इसलिए हर बार ब्लॉक निष्पादित किया जाता है। और आप चर को पुशबहेवियर चर के लिए "लेट" कीवर्ड घोषित नहीं कर सकते।

इसलिए आप अपनी आवश्यकता के अनुसार इस कोड का उपयोग कर सकते हैं।

मैं स्विफ्ट के लिए नया हूं। गणना की गई संपत्ति और बंद करने के लिए निर्धारित संपत्ति के बीच क्या अंतर है? मुझे पता है कि एक गणना की गई संपत्ति हर बार पुनर्गणित हो जाती है। क्या यह बंद करने के लिए अलग है? अर्थात

बंद:

var pushBehavior: UIPushBehavior = {
    let lazilyCreatedPush = UIPushBehavior()
    lazilyCreatedPush.setAngle(50, magnitude: 50)
    return lazilyCreatedPush
}()

अभिकलन:

var pushBehavior: UIPushBehavior {
    get{
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }
}

पहला एक संग्रहीत संपत्ति है जिसे एक क्लोजर के माध्यम से आरंभ किया जाता है। दूसरा एक गणना की गई संपत्ति है।

संग्रहीत प्रॉपर्टी की इनिशियलाइज़ेशन क्लोज़र को एक बार और केवल एक बार कहा जाता है, लेकिन आप बाद में संग्रहीत प्रॉपर्टी के मूल्य को बदल सकते हैं (जब तक कि आप var को let बदल नहीं let )। यह तब उपयोगी होता है जब आप किसी एकल में संग्रहीत संपत्ति को प्रारंभ करने के लिए कोड को संक्षिप्त करना चाहते हैं, कोड का संक्षिप्त खंड।

गणना की गई संपत्ति के ब्लॉक को, हर बार जब आप चर का संदर्भ देते हैं, कहा जाता है। यह उपयोगी है जब आप चाहते हैं कि कोड हर बार जब आप गणना की गई संपत्ति का संदर्भ दें। आम तौर पर आप ऐसा तब करते हैं जब संचित संपत्ति को हर बार संचित संपत्ति (उदाहरण के लिए, अन्य, संभवतः निजी, संग्रहीत गुणों से पुनर्गणना) के संदर्भ में पुनर्गणना की आवश्यकता होती है।

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

वैसे, अपने पहले उदाहरण में, आप आंतरिक रूप से इसे तात्कालिक रूप से आलसी होने के लिए संदर्भित करते हैं। यदि आप वह व्यवहार चाहते हैं, तो आपको lazy कीवर्ड का उपयोग करना होगा:

lazy var pushBehavior: UIPushBehavior = {
    let lazilyCreatedPush = UIPushBehavior()
    lazilyCreatedPush.setAngle(50, magnitude: 50)
    return lazilyCreatedPush
}()

यदि, हालांकि, संपत्ति static , तो यह स्वचालित रूप से तुरंत आलसी है।


यह एक उत्तर नहीं है, लेकिन यह सिर्फ इसके लिए ध्यान देने योग्य है:

  • एक संग्रहीत गुणों को मूल्य को आरंभीकरण के बाद पता होना चाहिए। यह डिफ़ॉल्ट रूप से या प्रारंभ के माध्यम से होता है।
  • एक संपीड़ित संपत्ति के मूल्य की गणना तब तक नहीं की जाती है जब तक कि वह एक्सेस न कर ले
  • एक आलसी लोड की गई संपत्ति का मूल्य तब तक परिभाषित नहीं किया जाता है जब तक कि वह एक्सेस न हो जाए

इसलिए गणना और आलसी चर दोनों के लिए आप बिना किसी चिंता के self या संग्रहीत गुणों तक पहुँच सकते हैं।





computed-properties