2015-10-17 14 views

Antwort

7

In

s.addListener("key", callback: { a, b in print("success") }) 

der Compiler kann die Art des Verschlusses von dem Kontext, d.h. von der Art des addListener() Verfahren schließen. Wenn das Verfahren beispielsweise als

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

dann kann der Compiler daraus schließen, dass das Argument

{ a, b in print("success") 

ist ein Verschluss unter zwei Int Parameter und Zurückkehren Void.

In

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

gibt es keinen solchen Zusammenhang daher die Compiler nicht die Art des Verschlusses wissen können. Der Rückgabetyp kann als Void gefolgert werden, da der Abschluss aus einem einzelnen Ausdruck besteht, , aber Sie müssen die Typen der Parameter angeben, z.

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

Große erklärung danke. :) –

+0

Danke Martin. JBM –

+0

Außerdem erhalten Sie diesen Fehler, wenn die Callback-Funktion einen Wert zurückgeben soll, aber Sie haben 'return value' noch nicht in den Abschluss eingegeben ... –

2

Erweiterung auf @ MartinRs ausgezeichnete Antwort.

Swift muss in der Lage sein zu folgern, dass cb vom Typ (Int, Int)->(), oder Sie können explizit den Typ festgelegt:

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

Dann könnten Sie feststellen, dass a und b ungenutzt sind und ersetzen sie durch _:

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

Warum können wir mit einem einzigen _ weg, wenn die Funktion 2 Parameter übernimmt? In diesem Fall kennt Swift 2 Parameter, so dass _ die Stelle des Tupels mit allen Parametern einnimmt. Es ersetzt (_, _).


können Sie verwenden _ mit @ martinR Antwort:

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

oder Sie können es gerne schreiben:

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

, die als gelesen werden kann:

cb nimmt zwei Parameter vom Typ Int die es ignoriert und druckt "erfolg"