2015-01-13 4 views
8

में क्लोजर उदाहरण को समझ में नहीं आता मैं तेजी से और बंद होने के बारे में जानने की कोशिश कर रहा हूं। मैं इस उदाहरण पर फंस गया हूँ।स्विफ्ट

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

क्या है (संख्या: Int) -> Int? क्या यह एक समारोह है? यह कहां परिभाषित किया जाता है? https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.html#//apple_ref/doc/uid/TP40014097-CH2-ID1

कीवर्ड "इन" क्या करता है? दस्तावेज़ "तर्क से अलग करने और शरीर से वापसी प्रकार" का उपयोग करने के लिए कहते हैं। मुझे यकीन नहीं है कि मैं इसे समझता हूं। "रिटर्न परिणाम" से "परिणाम = 3 * संख्या" को अलग करने के लिए "इन" का उपयोग क्यों नहीं किया जाता है।

+2

यह स्विफ्ट में बंद करने के लिए भी एक अच्छा परिचय है: http: //letvargo.mooo.com/a-beginners-guide-to-closures-in-swift/) –

उत्तर

28

एक बंद बस मानकों के साथ एक समारोह कोष्ठक के अंदर ले जाया जाता है की सामग्री, फ़ंक्शन बॉडी से पैरामीटर को अलग करने के लिए कीवर्ड in के साथ।

func myFunc(number: Int) -> Int { 
    let result = 3 * number 
    return result 
} 

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

आप वास्तव में उन दोनों को बिल्कुल उसी तरह कॉल कर सकते हैं: दो निम्न उदाहरण बराबर कार्यों को परिभाषित

let x = myFunc(2)  // x == 6 
let y = myClosure(2) // y == 6 

सूचना कैसे दूसरे उदाहरण वास्तव में पहले की तरह ही है, केवल में पहला उदाहरण, पैरामीटर (number: Int) -> Int ब्रैकेट के बाहर हैं, और दूसरे उदाहरण में पैरामीटर ब्रैकेट के अंदर हैं, इसके बाद कीवर्ड in है।

map आपके उदाहरण में एक सरणी (numbers) ले कर काम करता है और numbers में प्रत्येक तत्व को बंद करने के फ़ंक्शन को लागू करने का नतीजा है। तो यदि numbers[1, 2, 3] है, तो ऊपर दिया गया उदाहरण 1 से शुरू होगा। यह क्लोजर फ़ंक्शन लागू करेगा जो का उत्पादन करेगा (cuz यह सब पहले तत्व से तत्व को 3 से गुणा करता है)। यह numbers में प्रत्येक तत्व के लिए करता है, जब तक कि यह एक नई सरणी, [3, 6, 9] उत्पन्न नहीं करता है।

यदि आप चाहते थे, तो आप ऊपर दिए गए फ़ंक्शन या उपर्युक्त बंद के नामों का उपयोग करके map पर कॉल कर सकते हैं या इसे map के अंदर स्पष्ट रूप से लिखकर कॉल कर सकते हैं। नीचे दिए गए उदाहरणों के सभी पूरी तरह से बराबर हैं:

let numbers = [1, 2, 3] 

// Example 1 
let times3 = numbers.map(myFunc)  // times3 == [3, 6, 9] 

// Example 2 
let timesThree = numbers.map(myClosure) // timesThree == [3, 6, 9] 

// Example 3 
let xThree = numbers.map({ (number: Int) -> Int in 
    let result = 3 * number 
    return result      // xThree == [3, 6, 9] 
}) 

ध्यान दें कि उदाहरण 3 उदाहरण 2 के रूप में एक ही है, केवल उदाहरण 3 में बंद बाहर स्पष्ट रूप से map के अंदर लिखा जाता है, जबकि उदाहरण 2 में बंद सौंपा गया है निरंतर myClosure कहा जाता है, और निरंतर map पर आपूर्ति की गई है।

उम्मीद है कि यह मदद करता है - बंद मजेदार हैं, लेकिन भ्रमित हैं।

+0

मैं बंद होने के साथ भी अटक गया हूं, लेकिन आपका उत्तर मुझे समझने में मदद करें। धन्यवाद। –

+0

अरे धन्यवाद रोमन, यह निश्चित रूप से मदद की। अब यह मेरे लिए बहुत स्पष्ट है। पहली कोशिश करने के लिए ऐप्पल की व्याख्या थोड़ा सा खड़ी थी। –

+0

बहुत बहुत धन्यवाद! यह वास्तव में मुझे यह समझने में मदद करता है कि यह कोड स्निपेट कैसे काम करता है। –

1

समारोह आप कॉल कर रहे अपने पैरामीटर के रूप में एक बंद लेता है:

numbers.map({...}) 

कार्य करने के लिए प्रदान की बंद जब यह समारोह आप बुलाया द्वारा निष्पादित किया जाता है एक पैरामीटर मिलने की उम्मीद है। यह पैरामीटर अपने बंद करने में परिभाषित किया गया है:

(number: Int) -> Int in 

अब आप में पैरामीटर उपयोग कर सकते हैं बंद

let result = 3 * number 
    return result 
0

क्लोजर कार्यक्षमता के स्वयं निहित ब्लॉक हैं जिन्हें आपके कोड में पास किया जा सकता है और उपयोग किया जा सकता है।

सिंटेक्स:

{(parameterName: ParameterType) -> returnType in 
    //Statements 
} 

प्रैक्टिकल परिदृश्य: उपयोगकर्ता फ़िल्टर लागू करना चाहते हैं और मान चुनने के लिए जो 300 से अधिक (इस मामले में) है चाहता हूँ जब हम इस हासिल करने के लिए बंद कर सकते हैं।

var elements: [Int] = [Int]() //Declaring Empty array 
elements = [1001, 999, 555, 786, 988, 322, 433, 128, 233, 222, 201, 276, 133] 

var filteredElements = elements.map({(num: Int) -> Int? in 
    return num > 300 ? num : nil 
}) 

output: 
[Optional(1001), Optional(999), Optional(555), Optional(786), Optional(988), Optional(322), Optional(433), nil, nil, nil, nil, nil, nil] 

कोड नीचे से आप स्पष्ट रूप से हम elements.map लिए() फ़ंक्शन बंद गुजर रहे हैं देख सकते हैं।

बंद:

{(num: Int) -> Int? in 
     return num > 300 ? num : nil 
    } 

(num:Int) पैरामीटर है। Int? क्या हम वैकल्पिक इंटीजर प्रकार वापस करने जा रहे हैं।

in के बाद हम आपके तर्क लिख सकते हैं।

आप here बंद करने के बारे में अधिक पढ़ सकते हैं।