2016-01-07 8 views
24

में स्पष्ट रूप से आलसी स्थिर सदस्य मैंने अभी देखा है कि static स्विफ्ट structs के सदस्य निहित lazy हैं।स्विफ्ट

उदाहरण के लिए, यह केवल एक बार init कॉल करेगा:

class Baz { 
    init(){ 
     print("initializing a Baz") 
    } 
} 
struct Foo { 
    static let bar = Baz() 
} 

var z = Foo.bar 
z = Foo.bar 

इस के पीछे तर्क क्या है?

यदि मुझे विपरीत व्यवहार चाहिए तो क्या होगा?

+5

वैश्विक चर के लिए पसंद के लिए कुछ तर्क यहां आलसी हैं: https://developer.apple.com/swift/blog/?id=7। स्टार्टिक सदस्यों के पास संभवतः समान तर्क होगा, स्टार्टअप प्रारंभिकरण के लिए भी कम कारण को छोड़कर (मेरा मतलब है, यदि आपने कभी भी एक प्रकार का उपयोग नहीं किया है, तो इसे सिर्फ आयात के माध्यम से लाया गया था? क्या सभी स्थैतिक चर अभी भी उपयोग किए बिना प्रारंभ किए जाने चाहिए ?) –

उत्तर

39

static संपत्ति "प्रकार की संपत्ति" को परिभाषित करती है, जिसे एक बार तुरंत और एक बार तत्काल किया जाता है। जैसा कि आप ध्यान देते हैं, यह आलसी होता है, क्योंकि स्टेटिक्स ग्लोबल्स की तरह व्यवहार करते हैं। और The Swift Programming Language: Properties के रूप में कहते हैं:

वैश्विक स्थिरांक और चर हमेशा Lazy Stored Properties को एक समान तरीके से lazily गणना,। आलसी संग्रहीत गुणों के विपरीत, वैश्विक स्थिरांक और चर को lazy संशोधक के साथ चिह्नित करने की आवश्यकता नहीं है।

यह परोक्ष आलसी व्यवहार है, क्योंकि के रूप में Swift Blog: Files and Initialization का कहना है:

यह अनुमति देता है कस्टम initializers, स्विफ्ट में स्टार्टअप समय कोई वैश्विक initializers के साथ सफाई से मापता है यह धीमा करने के लिए, और निष्पादन का आदेश है पूरी तरह से अनुमानित।

उन्होंने जानबूझकर ऐप के स्टार्टअप में अनावश्यक रूप से देरी से बचने के लिए इसे इस तरह से डिज़ाइन किया।

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

+0

उदाहरण में "स्थैतिक चलो कैश = एनएससीएसी()", कैश प्रारंभ समय पर शुरू हुआ है, या केवल तभी जब "कैश पहले उपयोग किया जाता है" ...? – Fattie

+0

यह आलसी है। मैंने उस बिंदु को स्पष्ट करने के लिए अपना उत्तर अपडेट कर दिया है। – Rob