2016-01-08 19 views
6

Swiftの関数から関数を返すのが最も一般的な状況は何ですか?Swiftの別の関数から関数を返す場合

以下のコードでは関数を返すが、返す関数は返す関数の内部にあるため、実際には目的を見ていない。私が混乱している理由は、同じ機能を1つの機能で実現できるからです。

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)) 

誰かが、関数を返すような一般的な状況を指摘できますか?

これはSwift(私が思う)だけでなく一般的なプログラミングの基本であるので、これを理解したいと思います。

+2

これはプログラミングにとって基本的なものではない機能的プログラミングの概念です。これは、Dictionaryルックアップとして実行します。関数型プログラミングと 'currying'コンセプトについてお読みください。例:https://en.wikipedia.org/wiki/Curryingメリットの1つは、各関数が1つの引数しか取らないことです。 –

+6

@LaurentRivard curryingはswiftから削除される可能性があることに注意してください: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 
} 

それはむしろ不自然だが、それは単に原理を示して...「読者への課題」として

にしてみてくださいif

関連する問題