は、funcがあります:タイプ "INT->文字列 - > INT->ブール"
func (first: Int) -> Int -> Bool -> String {
return ?
}
書き方戻り値? 私は上記のfuncのような戻り値の型についてとても混乱しています。
は、funcがあります:タイプ "INT->文字列 - > INT->ブール"
func (first: Int) -> Int -> Bool -> String {
return ?
}
書き方戻り値? 私は上記のfuncのような戻り値の型についてとても混乱しています。
さんが言わせて閉包を定義します。
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
は
コードでそれを書くための方法:
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"
のようにそれを使用することができます
右から左へ読むと、関数/クロージャが返されます。最も外側のものは戻り値の型で、残りはカッコに入れることができます。このフォームは、もはや(ヘッドアップしてくれてありがとう@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)
私は、複数のパラメーターを取る関数があり、それを関数を返す関数に変換するときにカリングがあると思っていました(各引数に対して...など)。この質問には、複数のパラメータを持つ関数の記述はありませんでした。 – Vinzzz
curryingトランスフォームは、最終的に議論の中で関数シグネチャを生成する可能性があります。関数を返す関数を返す関数で終わる方法を説明するカリング情報があります。 – Cristik
残念ながら、Curryingは残念ながらgithub https://github.com/appleの迅速な進化リストでSwift 3.0で削除されます/ swift-evolution – Andrea
これは複雑すぎるものであり、おそらく書き換えられるはずです – Fonix
@Fonix - これはSwiftに組み込まれている関数プログラミングサポートの一部です – Cristik
@Cristikはそれほど読みにくくすることはありません。 'f(1)(2)(true)'ちょっと、obj-cとswiftがデベロッパーに(正当な理由で)使用させようとする、 "関数は文のように読むべきです"これには正当な理由があるかもしれませんが、避けることができると確信しています – Fonix