Swift Closure单一陈述问题

时间:2014-11-24 10:53:27

标签: swift closures

这里我有一个简单的片段,可以使用我定义的UIView的简单动画。

UIView.animateWithDuration(0.1) { [weak self] in

    self?.popOverView.center = gesture.locationInView(self?.view)
}

这里[弱自我]是为了避免引用循环,我也使用尾随闭包来简单地代码.Howerver,编译器对此不满意并给我错误的信息。

Cannot invoke 'animateWithDuration' with an argument list of type '(FloatLiteralConvertible, () -> () -> $T2)'

$ T2代表什么?奇怪的是,当封闭体中有两个或多个语句时,它会正确编译。

UIView.animateWithDuration(0.1) { [weak self] in
    println()
    self?.popOverView.center = gesture.locationInView(self?.view)
}

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

1 个答案:

答案 0 :(得分:5)

闭包中的单个语句体具有隐式返回,所以会发生的情况是编译器尝试设置此语句的结果:

self?.popOverView.center = gesture.locationInView(self?.view)

作为返回值。您可以通过添加明确的return

来解决此问题
self?.popOverView.center = gesture.locationInView(self?.view)
return

仅在单个语句中发生这种情况,这就是为什么它在第二种情况下正常工作

更多信息:Implicit Returns from Single-Expression Closures