2014-07-03 10 views
8

मैं एक बंद मैं का उपयोग कर स्विफ्ट Array.map समारोहस्विफ्ट Array.map बंद मुद्दा

मैं मूल रूप से एक सरणी ले रहा हूँ और उसके तत्वों को बंद करने का उपयोग कर के सभी remapping लिखा था पर सुधार करना चाहते हैं।

// Here's the array: 
var numbersArray = [1, 2, 3, 4, 5] 

// Here's the closure - it takes whatever number is passed into it and 
// multiplies it by 2.0 
var multiplier = { (currentNum: Int) -> Double in 
    let result = Double(currentNum) * 2.0 
    return result 
} 

// And here's how I'm calling it: 
var newArray = numbersArray.map(multiplier) 

और यह पूरी तरह से काम करता है।

लेकिन अगर मैं 2.1 से सबकुछ गुणा करना चाहता हूं तो क्या होगा? या 3.5? या कोई मूल्य? दूसरे शब्दों में, अगर मैं उस राशि को गुणा करना चाहता हूं जो मैं गुणा करता हूं तो परिवर्तनीय भी हो सकता है? और इसे दूसरे तर्क के रूप में बंद कर दिया गया है?

मैं इस तरह तर्क सूची में जोड़कर की कोशिश की:

var multiplier = { (currentNum: Int, factor: Double) -> Double in 
    let result = Double(currentNum) * factor 
    return result 
} 

और फिर इस के लिए मेरे कॉल बदल रहा:

var newArray = numbersArray.map(multiplier, 3.5) 

लेकिन मैं त्रुटियों के सभी प्रकार के हो रही है (और मैंने कोशिश की इस पाठ्यक्रम पर सभी तरह के बदलाव।)

मैं क्या गलत कर रहा हूं?

उत्तर

12

आप एक कस्टम फ़ंक्शन का उत्पादन करने के लिए एक उच्च ऑर्डर फ़ंक्शन का उपयोग कर सकते हैं जिसका उपयोग आप सरणी के मानचित्र फ़ंक्शन के साथ कर सकते हैं। इस तरह:

var numbersArray = [1, 2, 3, 4, 5] 

func multiplier(factor: Double) -> (Int)->Double 
{ 
    return { (currentNum: Int) -> Double in 
     let result = Double(currentNum) * factor 
     return result 
    } 
} 

var newArray = numbersArray.map(multiplier(2.5)) 
+1

बहुत बुरा-गधा है कि: -) बहुत चालाक। क्या यह ऐसा करने का एकमात्र तरीका है? – sirab333

+0

यह एकमात्र तरीका है जिसे मैं कम से कम सोच सकता हूं। मैं वास्तव में कार्यात्मक प्रोग्रामिंग का मास्टर नहीं हूं हालांकि – connor

+0

पर्याप्त मेला है। भले ही यह ऐसा करने का एकमात्र या "सर्वश्रेष्ठ" तरीका न हो, यह निश्चित रूप से बहुत अच्छा है। मैं आपको सही उत्तर के लिए क्रेडिट करूंगा। चीयर्स :-) – sirab333

14

संपादित करें: नोट: (लेकिन उसी तर्ज पर) यह भाषा सुविधा स्विफ्ट 2.

में कॉनर के जवाब से एक तेज-एर रास्ता हटा दिया गया था, एक curried उपयोग करने के लिए है समारोह। स्विफ्ट प्रोग्रामिंग से Language-> भाषा Reference-> Declarations-> Curried कार्य और तरीके:

एक समारोह की घोषणा की इस तरह से एक समारोह जिसका वापसी प्रकार एक और समारोह के रूप में समझा जाता है।

तो आप इस आसान बनाने में कर सकते हैं:

func multiplier(factor: Double) -> (Int)->Double 
{ 
    return { (currentNum: Int) -> Double in 
     let result = Double(currentNum) * factor 
     return result 
    } 
} 
इस के लिए

:

func multiplier(factor: Double)(currentNum: Int) -> Double { 
    return Double(currentNum) * factor 
} 

और यह ठीक उसी तरह का उपयोग करें:

let numbersArray = [1, 2, 3, 4, 5] 
let multipliedArray = numbersArray.map(multiplier(3.5)) 
संबंधित मुद्दे