成员'print'的模糊引用 - (Swift闭包中的范围?)

Jos*_*Mum 9 closures swift

这编译:

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)