2015-12-29 12 views
5

は、funcがあります:タイプ "INT->文字列 - > INT->ブール"

func (first: Int) -> Int -> Bool -> String { 

    return ? 
} 

書き方戻り値? 私は上記のfuncのような戻り値の型についてとても混乱しています。

+2

これは複雑すぎるものであり、おそらく書き換えられるはずです – Fonix

+0

@Fonix - これはSwiftに組み込まれている関数プログラミングサポートの一部です – Cristik

+0

@Cristikはそれほど読みにくくすることはありません。 'f(1)(2)(true)'ちょっと、obj-cとswiftがデベロッパーに(正当な理由で)使用させようとする、 "関数は文のように読むべきです"これには正当な理由があるかもしれませんが、避けることができると確信しています – Fonix

答えて

2

さんが言わせて閉包を定義します。

let closure: Int -> Bool 

閉包の型がわかっている(パラメータの型と戻り値の型)それは非常に簡単です。パラメータのリストには、キーワードinとそれに続く関数の本体名を指定します(関数の戻り値の型がVoid(a.k.あなたのケースでは()

// closure that returns if an integer is even 
closure = { integer in 
    return integer %2 == 0 
} 

は、Int -> Int -> Bool -> String

  • パラメータとしてのIntを取り、
    • パラメータとしてのIntを取り、
        を返す関数を返す関数を意味し、
      • Boolをパラメータとして とし、を返す関数です。
        • 文字列

コードでそれを書くための方法:

func prepareForSum(first: Int) -> Int -> Bool -> String { 
    return { secondInteger in 
     return { shouldSumIntegers in 

     var result: Int 
     // for the sake of example 
     // if boolean is true, we sum 
     if shouldSumIntegers { 
      result = first + secondInteger 
     } else { 
      // otherwise we take the max 
      result = max(first, secondInteger) 
     } 

     return String(result) 
    } 
} 

今、あなたはその

let sumSixteen = prepareForSum(16) // type of sumSixteen is Int -> Bool -> String 

let result1 = sumSixteen(3)(true) // result1 == "19" 
let result2 = sumSixteen(26)(false) // result2 == "26" 
のようにそれを使用することができます
9

右から左へ読むと、関数/クロージャが返されます。最も外側のものは戻り値の型で、残りはカッコに入れることができます。このフォームは、もはや(ヘッドアップしてくれてありがとう@Andrea)スウィフト3.0でサポートされなくなりますけれども

このように、あなたの関数の宣言は

func (first: Int) -> ((Int) -> ((Bool) -> String)) 

に相当し、

func (first: Int)(_ second: Int)(_ third: Bool) -> String 

です。

これはfunction curryingとして知られています。関数は、引数としてIntをとり、パラメータとしてBoolをとり、Stringを返す関数を返します。この方法で簡単に ファンクションコールをチェーンすることができます。

だからあなたのメソッドの本体には、次のシグネチャを持っているものを、リスト内の最初の関数を返す必要があります。

func ((Int) -> ((Bool) -> String)) 

あなたは、このようにそれを呼び出すことができます。

f(1)(2)(true) 
+0

私は、複数のパラメーターを取る関数があり、それを関数を返す関数に変換するときにカリングがあると思っていました(各引数に対して...など)。この質問には、複数のパラメータを持つ関数の記述はありませんでした。 – Vinzzz

+0

curryingトランスフォームは、最終的に議論の中で関数シグネチャを生成する可能性があります。関数を返す関数を返す関数で終わる方法を説明するカリング情報があります。 – Cristik

+0

残念ながら、Curryingは残念ながらgithub https://github.com/appleの迅速な進化リストでSwift 3.0で削除されます/ swift-evolution – Andrea

関連する問題