2016-01-08 5 views
6

में किसी अन्य फ़ंक्शन से कोई फ़ंक्शन वापस करने के लिए जब यह स्विफ्ट में किसी फ़ंक्शन से फ़ंक्शन वापस करना चाहते हैं तो यह सबसे आम स्थिति क्या है?स्विफ्ट

नीचे दिए गए कोड में मैं एक फ़ंक्शन लौटा रहा हूं लेकिन मुझे वास्तव में यह उद्देश्य दिखाई नहीं देता है क्योंकि मैं जिस फ़ंक्शन को वापस कर रहा हूं वह उस कार्य के अंदर है जो इसे वापस कर रहा है। कारण मैं उलझन में हूं क्योंकि हम एक ही चीज़ को केवल एक समारोह के साथ पूरा कर सकते हैं।

func person() -> ((String, Int) -> String) { 

    func info(name: String, age: Int) -> (String) { 
    return "\(name) is \(age) old" 
    } 

    return info 
} 


let nathan = person() 
nathan("Nathan", 3) 

print(nathan("Nathan", 3)) 

क्या कोई सामान्य परिस्थितियों को इंगित कर सकता है जहां आप एक फ़ंक्शन वापस करना चाहते हैं और शायद इसे बेहतर उदाहरण के साथ चित्रित करना चाहते हैं?

मैं इसे समझना चाहता हूं क्योंकि यह सामान्य रूप से स्विफ्ट (मुझे लगता है) में प्रोग्रामिंग के लिए मौलिक है।

+2

यह एक कार्यात्मक प्रोग्रामिंग अवधारणा है, जो प्रोग्रामिंग के लिए आवश्यक नहीं है। आपको कार्यात्मक प्रोग्रामिंग और 'करीइंग' अवधारणा के बारे में पढ़ना चाहिए। उदाहरण के लिए यह लिंक देखें: https://en.wikipedia.org/wiki/Currying लाभ में से एक यह है कि प्रत्येक कार्य केवल 1 तर्क में होता है। –

+6

@LaurentRivard ध्यान दें कि करी को संभावित रूप से तेज़ी से हटा दिया जाएगा: https://github.com/apple/swift-evolution/blob/master/proposals/0002-remove-currying.md – luk2302

+0

[मेरा जवाब यहां देखें] (http://stackoverflow.com/a/34566757/2442804) वास्तविक लौटा/प्रयुक्त ऑब्जेक्ट – luk2302

उत्तर

6

एक उत्कृष्ट उदाहरण एक कैलकुलेटर कार्यक्रम में हो सकता है, उदाहरण के लिए:

func operatorForString(str: String) -> ((Float, Float) -> Float)? { 
    if str == "+" { 
     return (+) // brackets required to clarify that we mean the function 
    } else if str == "-" { 
     return (-) 
    } else if str == "*" { 
     return (*) 
    } else if str == "/" { 
     return (/) 
    } else if str == "**" { 
     return pow // No brackets required here 
    } else { 
     return nil 
    } 
} 

if let op = operatorForString("-") { 
    let result = op(1, 2) // -1 
} 

यह बल्कि काल्पनिक है, लेकिन यह केवल सिद्धांत को दिखाता है ...

एक "पाठक के लिए व्यायाम" जैसा करने की कोशिश इसे Dictionary लुकअप के रूप में करें, if s को दोहराए जाने के बजाय :)