这编译:
let s = SignalsService()
s.addListener( "key", callback: { a, b in print( "success" ) } )
Run Code Online (Sandbox Code Playgroud)
这不是:
let s = SignalsService()
let cb = { a, b in print( "success" ) }
s.addListener( "key", callback: cb )
Run Code Online (Sandbox Code Playgroud)
引发错误Ambiguous reference to member 'print'的let cb = ...行.
那为什么呢?
Mar*_*n R 10
在
s.addListener( "key", callback: { a, b in print( "success" ) } )
Run Code Online (Sandbox Code Playgroud)
编译器可以从上下文推断闭包的类型,即从addListener()方法的类型.如果该方法例如声明为
func addListener(key : String, callback: (Int, Int) -> Void)
Run Code Online (Sandbox Code Playgroud)
然后编译器可以推断出该参数
{ a, b in print( "success" )
Run Code Online (Sandbox Code Playgroud)
是一个关闭两个Int参数并返回Void.
在
let cb = { a, b in print( "success" ) }
Run Code Online (Sandbox Code Playgroud)
没有这样的上下文,因此编译器无法知道闭包的类型.返回类型可以推断为
Void因为闭包由单个表达式组成,但您必须指定参数的类型,例如
let cb = { (a : Int, b : Int) in print( "success" ) }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4916 次 |
| 最近记录: |