2014-06-09 5 views
6

मैं स्विफ्ट प्रोग्रामिंग भाषा पढ़ रहा हूँ सरल मान अनुभाग में,देना घोषणाओं एक प्रारंभकर्ता अभिव्यक्ति

“Use let to make a constant and var to make a variable. The value of a constant doesn’t need to be known at compile time, but you must assign it a value exactly once”

तो मुझे लगता है मैं इस

let aConstant:Int 
aConstant = 5 

कर सकते हैं की आवश्यकता होती है लेकिन मैं देना घोषणाओं मिल प्रारंभकर्ता अभिव्यक्ति की आवश्यकता है !!

वह क्यों है? उनका मतलब क्या है "स्थिरता के मूल्य को संकलन समय पर ज्ञात होने की आवश्यकता नहीं है"?

उत्तर

11

के लिए इसे बदल से Swift Language Reference:

When a constant is declared at global scope, it must be initialized with a value.

आप केवल एक का आरंभीकरण स्थगित कर सकते हैं कक्षाओं/structs में निरंतर, जहां आप इसे टी में शुरू करने के लिए चुन सकते हैं वह कक्षा/संरचना के प्रारंभकर्ता।

"स्थिरता के मूल्य को संकलन समय पर ज्ञात करने की आवश्यकता नहीं है" का अर्थ निरंतर के मान को संदर्भित करता है। सी/उद्देश्य-सी में वैश्विक स्थिरता को एक मान असाइन करने की आवश्यकता होती है जिसे संकलक द्वारा गणना की जा सकती है (आमतौर पर 10 या @"Hello" जैसे शाब्दिक)। निम्नलिखित ऑब्जेक्टिव-सी में अनुमति नहीं दी जाएगी:

static const int foo = 10; // OK 
static const int bar = calculate_bar(); // Error: Initializer element is not a compile-time constant 

स्विफ्ट में आप इस प्रतिबंध की जरूरत नहीं है:

let foo = 10 // OK 
let bar = calculateBar(); // OK 

संपादित करें:

मूल जवाब में निम्नलिखित बयान सही नहीं है:

You can only defer initialization of a constant in classes/structs, where you can choose to initialize it in the initializer of the class/struct.

एकमात्र जगह whe फिर आप स्थगित नहीं कर सकते वैश्विक दायरे (यानी। शीर्ष स्तर let अभिव्यक्ति)। हालांकि यह सच है कि आप कक्षा/संरचना में प्रारंभिकता को रोक सकते हैं, यह एकमात्र जगह नहीं है।

func foo() { 
    let bar: Int 
    bar = 1 
} 
1

let कीवर्ड, परिभाषा के अनुसार, constant परिभाषित करता है।

इस प्रकार, आप सेट होने के बाद इसे संशोधित नहीं कर सकते हैं।

इस मामले के बाद, उन्हें घोषित होने पर प्रारंभ करने की आवश्यकता है!

समाधान यहाँ करने के लिए या तो है:

let aConstant = 5 

या एक var

var aNonConstant:Int 
aNonConstant = 5 
+0

कैसे "के बारे में मूल्य संकलन समय पर निरंतर ज्ञात होने की आवश्यकता नहीं है "? – onmyway133

+1

नहीं, ऐसा नहीं है, आप 'एक कॉन्स्टेंट = functionThatGeneratesARandomNumber() 'कर सकते हैं, लेकिन यह अभी भी उस बिंदु के बाद स्थिर है और आप इसे फिर से असाइन नहीं कर सकते हैं। – Jack

+1

इसके अलावा, स्विफ्ट में स्थिरांक 'Int' जैसे शाब्दिक तक ही सीमित नहीं हैं। आपके पास स्थिर समय हो सकता है जो रन-टाइम पर बनाई गई वस्तु है। आपको याद रखने वाली एकमात्र चीज यह है कि इसे परिभाषित (निरंतर!) के बाद फिर से असाइन नहीं किया जा सकता है। – Jack

2

एक निरंतर संकलन में जाना जाने की जरूरत नहीं है, लेकिन यह प्रारंभ के बाद एक मान होना चाहिए: आप के लिए लगातार सेट करने के लिए

class MyClass: NSObject { 
    let aConstant: Integer; // no value 

    init() { 
     aConstant = 4; // must have a value before calling super 
     super.init(); 
    } 
} 

यह अनुमति देता है निम्नलिखित भी उदाहरण के लिए कानूनी है इसके बाद एक मूल्य घोषित किया गया है और संकलन समय पर संभावित रूप से अज्ञात है।स्विफ्ट 2 के लिए

1

उत्तर:

इस प्रकार आप स्थिरांक लिख सकते हैं:

let aConstant:Int 
aConstant = 5 

प्रकार इस तरह से इसका मतलब है की स्थापना: "यह स्थिर हो जाएगा और यह मूल्य होगा जब आप इसे की जरूरत है"।

Constant 'aConstant' used before being initialized

इसके अलावा आप केवल एक बार aConstant के लिए मूल्य निर्धारित कर सकते हैं: ध्यान दें कि आप इसे करने के लिए मूल्य निर्धारित करने से पहले लगातार उपयोग नहीं कर सकते, वहाँ एक संकलन समय त्रुटि है। आप दूसरी बार के लिए मूल्य सेट करने का प्रयास करते हैं, तो वहाँ संकलन समय त्रुटि:

Immutable value 'aConstant' may only be initialized once

वैसे भी आप वैश्विक स्थिरांक के लिए ऐसा नहीं कर सकते, वहाँ संकलन है समय त्रुटि:

Global 'let' declaration requires an initializer expression

संबंधित मुद्दे