2015-10-17 18 views

Odpowiedz

7

W

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

kompilator może ustalić typ zamknięcia z kontekstu to znaczy od rodzaju metody addListener(). Jeśli metoda ta jest na przykład deklarowany jako

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

kompilator może wnioskować, że argument

{ a, b in print("success") 

jest zamknięcie po dwa Int parametry i powrocie Void.

W

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

nie ma takiego kontekstu, więc kompilator nie może wiedzieć rodzaju zamknięcia. Typ zwrotu można wywnioskować jako Void, ponieważ zamknięcie składa się z pojedynczego wyrażenia, , ale trzeba określić typy parametrów, np.

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

Wielkie wyjaśnienie dzięki. :) –

+0

Dzięki Martin. JBM –

+0

Ponadto pojawia się ten błąd, gdy funkcja oddzwaniania powinna zwracać wartość, ale nie wpisałeś jeszcze 'return value' do zamknięcia ... –

2

Rozszerzenie doskonałej odpowiedzi @ MartinR.

Swift musi być w stanie wywnioskować, że cb jest typu (Int, Int)->(), lub można jawnie ustawić typ:

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

Następnie można zauważyć, że a i b są nieużywane i zastąpić je _:

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

Dlaczego możemy uciec pojedynczemu _, gdy funkcja przyjmuje 2 parametry? W takim przypadku Swift wie, że są 2 parametry, więc _ zajmuje miejsce krotki zawierającej wszystkie parametry. Zastępuje (_, _).


Można użyć _ z użytkownika @ MartinR odpowiedź:

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

lub można napisać to lubią:

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

który można odczytać jako:

cb przyjmuje dwa parametry typu Int, który ignoruje i drukuje "sukces"