2014-06-10 3 views
7

क्या यह एक कार्य या बंद है?स्विफ्ट: कार्यों बनाम परिभाषा और वाक्यविन्यास बनाम बंद करें

let triple: Int -> Int = { 
    (number: Int) in // What is this? 
    let result = 3 * number 
    number 
    return result 
} 

triple(1) 
+3

से पहले सामान 'in' वहाँ चर के कार्यों के लिए आदानों प्रदान करती है। इस मामले में 'संख्या' को इस बंद करने के लिए पास किए गए इनपुट पैरामीटर को असाइन किया जाएगा, जो' 1' है। 'in'' inout' से पूरी तरह से असंबंधित है, जो संदर्भ – Jack

उत्तर

9

1: यह बंद है।

उदाहरण:

func aFunction() ->() { 
    // do something 
} 

let aClosure:() ->() = { 
    // do something 
} 

कार्य वास्तव में बंद का एक विशेष मामला है। आप ब्रेसिज़ ({}) के साथ आसपास के कोड द्वारा नाम के बिना बंद कर सकते हैं। में उपयोग करें तर्क और शरीर से वापसी प्रकार अलग करें।

से उद्धरण: ऐप्पल इंक "स्विफ्ट प्रोग्रामिंग भाषा।" IBooks। https://itun.es/us/jEUH0.l

2: "इन" केवल यह संकेत देने के लिए चुना गया है कि तर्क/वापसी प्रकार समाप्त होता है, और बंद होने का शरीर शुरू होता है। इसमें प्रवेश करने के लिए कुछ भी नहीं है।

+2

द्वारा पास निर्दिष्ट करता है क्यों मैं फ़ंक्शन का उपयोग करता हूं और इसका उपयोग बंद या इसके विपरीत नहीं करता? असली अंतर क्या है? –

5

यह स्थिर triple को बंद करने के बाध्यकारी है जो वैश्विक दायरे में किया गया है, इसे एक समारोह के रूप में घोषित करने के समान है (अंतर के लिए नीचे एरिक द्वारा टिप्पणी देखें)। (number: Int) in लाइन बंद करने के लिए इनपुट पैरामीटर घोषित करता है।

इस मामले में प्रकार बाहर छोड़ा जा सकता है, हालांकि बाद से यह बंद प्रकार से अनुमान लगाया जा सकता है, और क्योंकि यह केवल एक ही बयान है यह रूप में निहित वापसी के साथ एक बंद अभिव्यक्ति के रूप में लिखा जा सकता है:

let triple: Int -> Int = { number in 
    3 * number 
} 

// or as a function 
func triple(number: Int) -> Int { 
    return 3 * number 
} 

// Or as the very short 
let triple: Int -> Int = { 3 * $0 } 

आप इसके बारे में आधिकारिक दस्तावेज अध्याय में बंद होने के बारे में अधिक पढ़ सकते हैं। इस प्रकार

https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/Closures.html

+3

एक चर के लिए एक बंद करने के बाध्यकारी समान है, लेकिन ** ** ** एक समारोह के रूप में घोषित करने के समान नहीं है। महत्वपूर्ण मतभेदों के तीन उदाहरणों में अधिभार, डिफ़ॉल्ट पैरामीटर मान, और जेनेरिक शामिल हैं, जिनमें से कोई भी बाध्य बंद करने का समर्थन नहीं कर सकता है। –

+0

यह सच है, मैंने इस टिप्पणी में एक पॉइंटर के साथ जवाब अपडेट किया है। – hallski

4

स्विफ्ट क्लोजर परिभाषित कर रहे हैं:

{ (parameters) -> return type in 
    statements 
} 

इस प्रकार, अपने कोड नमूना परिभाषा के द्वारा एक बंद माना जाता है। हालांकि, मैं यह फिर से लिखने के रूप में घुंघराले ब्रेसिज़ के भीतर वापसी प्रकार ले जाकर इस प्रकार है:

let triple = { 
    (number: Int) -> Int in 
    let result = 3 * number 
    number 
    return result 
} 

triple(1) 

मापदंडों और वापसी प्रकार खोलने घुंघराले ब्रेस के बाद शुरू हो और कीवर्ड में से पहले समाप्त करने और बंद करने की शरीर के बाद शुरू होता है कीवर्ड में और समापन घुंघराले ब्रेस पर समाप्त होता है।

https://itunes.apple.com/us/book/swift-programming-language/id881256329?mt=11

3

प्रकार्य और संवृति है के बीच अंतर करने के लिए एक आसान तरीका,

ग्लोबल फ़ंक्शन: एक है इसके बाद, मैं डाउनलोड करने और iTunes निम्न स्थान पर पाया जा सकता है जहाँ से iBook पढ़ने की सिफारिश करेंगे नाम। किसी भी मूल्य पर कब्जा मत करो।

नेस्टेड फ़ंक्शन: नाम है। कार्य संलग्न करने से मूल्यों को कैप्चर करें।

क्लोजर: नाम नाम की तरह नहीं है। आसन्न ब्लॉक से मूल्यों को कैप्चर करें।

3

एक फ़ंक्शन एक बंद है जिसका नाम है। आपके द्वारा प्रदान किया गया बंद, एक नाम है और इसलिए यह एक समारोह और बंद दोनों है।

एप्पल के डेवलपर वेबसाइट से:

वैश्विक और नेस्टेड काम करता है, के रूप में कार्य में शुरू की, वास्तव में बंद का विशेष मामले हैं। क्लोजर तीन रूपों में से एक लेते हैं:

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

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

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