2017-06-12 8 views
0

こんにちは私は閉鎖として最後の引数を受け入れる関数を作成しました。即時閉鎖の問題?

func sum(from: Int, to: Int, f: (Int) -> (Int)) -> Int { 
    var sum = 0 
    for i in from...to { 
     sum += f(i) 
    } 
    return sum 
} 

ここで私はこの関数を呼び出すときにこの関数を呼び出します。この関数を呼び出す方法は次のとおりです。

sum(from: 1, to: 10) { (num) -> (Int) in 
return 10 
} 

私は、私はこのような関数を呼び出すことができますクロージャを末尾closure.With後続として迅速における概念の一つを見てきました。

sum(from: 1, to: 10) { 
    $0 
} 

が、それが起こっているかを教えてstatement.please任意のリターンせずに呼び出すことができている理由がわからないのですか?

答えて

1

@ rob-napierは、言語で許されているからです。

しかし、あなたの例でも、その最後の部分に二つの異なる事をやっている注意してください。

sum(from: 1, to: 10) { 
    $0 
} 

は、あなたはまた、名前付きパラメータを省略している、returnの文を省略しているだけでなく、そう$0ではありませんreturn機能の省略に依存します。

これは単にreturnを省略するため、より正確な例のようになります。私はこれらのfeaturesのいずれかを使用してお勧めしません、と述べた

sum(from: 1, to: 10) { (num) -> (Int) in 
    num 
} 

。ほとんどの場合、後でコードを読みやすくする方がよいでしょう。あなたの将来の自己(そしてあなたの後にコードを使用する人)はあなたに感謝します。

3

実際には、「言語が許している」以外の回答はありません。クロージャー内に単一の式がある場合は、returnを省略することができます。

これをカバーするセクションはSwiftプログラミング言語の"Implicit Returns from Single-Expression Closures"です。ここで

reversedNames = names.sorted(by: { s1, s2 in s1 > s2 }) 

、の関数型:

シングル式のクロージャは暗黙のうちに、前の例のこのバージョンのように、その宣言からreturnキーワードを省略することにより、その単一の式の結果を返すことができますソートされた(by :)メソッドの引数は、Bool値がクロージャによって返されなければならないことを明確にします。クロージャーの本体にはBool値を返す単一の式(s1> s2)が含まれているため、あいまいさがなく、returnキーワードを省略できます。

ただし、これは後続のクロージャ構文とは関係ありません。すべてのクロージャは、単一式であれば暗黙のリターンを持ちます。

+0

「ガード」文を使用している場合は、末尾のクロージャで置き換えることはできません。 [ここ](https://stackoverflow.com/questions/44504563/swift-nested-optionals-in-a-single-guard-statement/44504607?noredirect=1#comment76005618_44504607)を参照してください。 – Honey