Swift Closure单一陈述问题

tou*_*bun 3 closures swift

在这里,我有一个简单的片段,使用我定义的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)

我知道如果闭包体中只有一个语句,它会自动返回.

Ant*_*nio 5

闭包中的单个语句体具有隐式返回,因此编译器尝试设置此语句的结果:

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)

这只发生在单个语句中,这就是它在第二种情况下正常工作的原因

更多信息:单表达式闭包的隐式返回