2015-10-17 10 views

risposta

7

In

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

il compilatore può dedurre il tipo di chiusura dal contesto, cioè dal tipo di metodo addListener(). Se tale metodo è per esempio dichiarati

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

quindi il compilatore può dedurre che l'argomento

{ a, b in print("success") 

è una chiusura prendendo due Int parametri e ritornando Void.

In

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

non esiste tale contesto, pertanto il compilatore non può sapere il tipo di chiusura. Il tipo di ritorno può essere dedotto come Void perché la chiusura consiste in una singola espressione, ma devi specificare i tipi di parametri, ad es.

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

Grande spiegazione, grazie. :) –

+0

Grazie Martin. JBM –

+0

Inoltre, si ottiene questo errore quando la funzione di callback deve restituire un valore, ma non si è ancora digitato 'return value' nella chiusura ancora ... –

2

Ampliamento dell'eccellente risposta di @ MartinR.

Swift ha bisogno di essere in grado di dedurre che cb è di tipo (Int, Int)->(), o si potrebbe impostare in modo esplicito il tipo:

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

Poi si potrebbe notare che a e b sono inutilizzati e sostituirli con _:

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

Perché è possibile scappare con un singolo _ quando la funzione richiede 2 parametri? In questo caso, Swift sa che ci sono 2 parametri, quindi lo _ prende il posto della tupla che contiene tutti i parametri. Sostituisce (_, _).


È possibile utilizzare _ con @ di MartinR risposta:

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

o si può scrivere come:

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

che può essere letto come:

cb prende due parametri di tipo Int che ignora e stampa "successo"