2017-01-25 8 views
5

2016 के नवंबर में वापस मैं कारण है कि मैं गार्ड का उपयोग नहीं कर सकता है वैकल्पिक रूप में एक ही नाम का उपयोग कर एक चर का एक unwrapped संस्करण बनाने के लिए, की तरह आप कर सकते हैं पूछ एक प्रश्न पोस्ट करते हैं, तो साथ:'गार्ड चलो foo = foo' कानूनी कब बन गया?

लिंक: Why isn't guard let foo = foo valid?

जब मैं उस सवाल का लिखा है, नीचे दिए गए कोड है कि "पिछले मान के साथ परिभाषा संघर्ष" एक त्रुटि के साथ संकलित करने के लिए विफल हो जाएगा:

//Test of using guard to create an unwrapped version of a var, like if let 
func guardTest(_ viewController: UIViewController?) -> UIViewController? { 
    // Check if the current viewController exists 
    print(String(describing: viewController)) 
    guard let viewController = viewController else { 
    return nil 
    } 
    print(String(describing: viewController)) 

    return viewController 
} 

हालांकि, मैं सिर्फ इतना है कि यह करता है काम पर कुछ कोड पाया, और अब यह संकलित करता है शिकायत के बिना और जो मैं चाहता हूं वह करता है! जब चलाने के लिए, प्रिंट बयान बताते हैं कि foo गार्ड से पहले एक वैकल्पिक, और एक unwrapped वैकल्पिक के बाद है:

viewController = Optional(<TrochoidDemo.ViewController: 0x7ff16a039a00>) 
viewController = <TrochoidDemo.ViewController: 0x7ff16a039a00> 

(मैं अपने नवीनतम खुला स्रोत परियोजना के लिए परीक्षण समारोह guardTest(_:) कहा कि यदि आप इसे बाहर की कोशिश करना चाहते हैं। यह https://github.com/DuncanMC/TrochoidDemo)

मुझे खुशी है कि इस संरचना अब काम करता है के रूप में मैं यह करना चाहता हूँ हूँ पर Github पर उपलब्ध है, लेकिन क्यों यह अब कानूनी है के रूप में उलझन में है, और जब परिवर्तन हुआ।

क्या किसी को भाषा परिभाषा में हालिया परिवर्तन के बारे में पता है जो इस निर्माण कार्य को बनाता है जहां यह पहले नहीं था?

+3

यह अभी भी फ़ंक्शन में किसी अन्य स्थानीय चर को फिर से परिभाषित करने के लिए काम नहीं करता है। ऐसा लगता है कि स्विफ्ट आपको स्थानीय वैरिएबल बनाने की अनुमति देगा जिसमें फ़ंक्शन में इनपुट पैरामीटर के समान नाम है। मुझे नहीं पता कि यह हमेशा काम करता है, लेकिन 'var a = a' अब इनपुट पैरामीटर को' var' में परिवर्तित करने का तरीका है क्योंकि आप अब फ़ंक्शन हस्ताक्षर में var नहीं डाल सकते हैं। – vacawama

+2

ठीक है, नीचे वोट क्यों? अगर आपको लगता है कि मेरा सवाल खराब है, तो कृपया बताएं क्यों। –

+2

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

उत्तर

8

टी एल; डॉ

guard let foo = foo कानूनी अगर foo एक और दायरे में परिभाषित किया गया है।


उदाहरण अपने लिंक किए गए सवाल से:

func test() 
{ 
    let a: Int? = 1 

    guard let a = a else{ 
    return 
    } 
    print("a = \(a)") 
} 

अभी भी क्योंकि guard बयान अन्य चर a एक ही दायरे में बनाने के लिए कोशिश कर रहा है काम नहीं करता।

यह उदाहरण: एक ही कारण है कि यह करता है के लिए

//Test of using guard to create an unwrapped version of a var, like if let 
func guardTest(_ viewController: UIViewController?) -> UIViewController? { 
    // Check if the current viewController exists 
    print(String(describing: viewController)) 
    guard let viewController = viewController else { 
    return nil 
    } 
    print(String(describing: viewController)) 

    return viewController 
} 

काम करता है:

func test(a: Int) 
{ 
    print(type(of: a)) // Int 

    let a = 3.14 

    print(type(of: a)) // Double 
} 

कार्य करने के लिए पैरामीटर, एक अलग दायरे में परिभाषित किया गया है ताकि स्विफ्ट आप एक स्थानीय बनाने की अनुमति देता एक ही नाम के साथ चर।

+2

ठीक है, यह समझ में आता है। इसे क्लीयर करने के लिए शुक्रिया।यह अजीब लगता है कि आपका उदाहरण कानूनी है, क्योंकि आपके 'let = 3.14' पैरामीटर को पहुंच योग्य बनाता है। –

+0

यह हर समय होता है। स्थानीय चर स्कॉप्स को संलग्न करने से अन्य चर छुपाते हैं। चीज जो मुझे पहेली करती है, वह पहला 'प्रिंट (प्रकार: ए))' त्रुटि नहीं देता है, लेकिन यह इस मामले में करता है 'एक = 3 func test() { प्रिंट (प्रकार (की: क)) एक = 3.14 प्रिंट करते हैं (प्रकार (की: क)) } ' – vacawama

+0

मैं स्थानीय दायरे में किया जा रहा है, न कि एक संलग्न गुंजाइश के रूप में एक समारोह के लिए मानकों के बारे में सोच। यह चर्चा यह स्पष्ट करती है कि मानकों को वास्तव में एक संलग्न क्षेत्र से माना जाता है। इस प्रकार 'var a = a' एक पैरामीटर होने पर कानूनी होता है, क्योंकि यह निरंतर दायरे से स्थिर होता है और इसे वर्तमान दायरे में एक चर के रूप में परिभाषित करता है। –

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