Swift 闭包单语句问题

3

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

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

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

这里的 [弱引用] 是为了避免引用循环,我还使用了尾随闭包来简化代码。然而,编译器对此不满并给出错误信息。

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个回答

5

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

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

作为返回值。您可以通过添加显式的return来修复这个问题。
self?.popOverView.center = gesture.locationInView(self?.view)
return

这只会发生在单个语句中,这就是为什么它在您的第二个案例中正确工作的原因。
更多信息请参见:隐式返回单表达式闭包

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接