2015-10-17 32 views

回答

7

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

編譯器可以從上下文中, 即,從addListener()方法的類型推斷出閉合的類型。如果該方法是 例如聲明爲

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

那麼編譯器可以推斷出該參數

{ a, b in print("success") 

是閉合接受兩個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使用,仍在與_替換它們:

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

爲什麼我們可以用一個_當這個函數需要2個參數?在這種情況下,Swift知道有2個參數,所以_代替包含所有參數的元組。它取代了(_, _)


您可以使用_與@ MartinR的回答是:

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

,或者你可以寫這樣的:

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

這可以理解爲:

cb需要兩個類型的參數它忽略和打印 「成功」