2015-10-17 40 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需要两个类型的参数它忽略和打印 “成功”