2015-10-17 7 views

答えて

7

方法の種類から、すなわち 、文脈から閉鎖の種類を推測することができるコンパイラ

s.addListener("key", callback: { a, b in print("success") }) 
で。その方法は であれば、たとえば、コンパイラは、引数

{ a, b in print("success") 

は2つのIntのパラメータを取り、Voidを返すクロージャであると推測することができます

func addListener(key : String, callback: (Int, Int) -> Void) 

として宣言。

let cb = { a, b in print("success") } 

そのようなコンテキストが存在しない、従ってコンパイラは、クロージャの 種類を知ることができません。戻り値の型は Voidと推定できます。クロージャーは単一の式 で構成されていますが、パラメーターの型を指定する必要があるためです。

let cb = { (a : Int, b : Int) in print("success") } 
+0

大変お礼申し上げます。 :) –

+0

マーティンに感謝します。 JBM –

+0

また、コールバック関数が値を返す必要があるが、まだクロージャに 'return value'をタイプしていないときにこのエラーが発生します... –

2

@MartinRの優れた答えがさらに拡大しています。

スウィフトはcbがタイプ(Int, Int)->()である、またはあなたが明示的にタイプを設定することができることを推測できるようにする必要があります:

let cb: (Int, Int)->() = { a, b in print("success") } 

次にあなたがabが使用されていないことに気づくと_とそれらを置き換えることができます:

関数は、2つのパラメータを取るとき
let cb: (Int, Int)->() = { _ in print("success") } 

は、なぜ我々は、単一の_で逃げることができますか?この場合、Swiftには2つのパラメータがあることがわかるため、_はすべてのパラメータを含むタプルの代わりになります。それは(_, _)を置き換えます。

let cb = { (_:Int, _:Int) in print("success") } 

またはあなたはそれが好きで書くことができます:

として読み取ることができ
let cb = { (_:(Int, Int)) in print("success") } 

cbあなたがMartinRの答え@で_を使用することができます


タイプの2つのパラメータをとります。それを無視して印刷する 「成功」

関連する問題