在这里,我有一个简单的片段,使用我定义的UIView的简单动画.
UIView.animateWithDuration(0.1) { [weak self] in
self?.popOverView.center = gesture.locationInView(self?.view)
}
Run Code Online (Sandbox Code Playgroud)
这里[弱自我]是为了避免引用循环,我也使用尾随闭包来简单地代码.Howerver,编译器对此不满意并给我错误的消息.
Cannot invoke 'animateWithDuration' with an argument list of type '(FloatLiteralConvertible, () -> () -> $T2)'
Run Code Online (Sandbox Code Playgroud)
$ T2代表什么?奇怪的是,当闭包体中有两个或多个语句时,它会正确编译.
UIView.animateWithDuration(0.1) { [weak self] in
println()
self?.popOverView.center = gesture.locationInView(self?.view)
}
Run Code Online (Sandbox Code Playgroud)
我知道如果闭包体中只有一个语句,它会自动返回.
闭包中的单个语句体具有隐式返回,因此编译器尝试设置此语句的结果:
self?.popOverView.center = gesture.locationInView(self?.view)
Run Code Online (Sandbox Code Playgroud)
作为返回值.您可以通过添加显式来解决此问题return
self?.popOverView.center = gesture.locationInView(self?.view)
return
Run Code Online (Sandbox Code Playgroud)
这只发生在单个语句中,这就是它在第二种情况下正常工作的原因
更多信息:单表达式闭包的隐式返回