animateWithDuration()
有关。
我们有一些用Xcode 6.3 beta / Swift 1.2编写的代码,我试图让它在Xcode 6.2 / Swift 1.1中运行。
这是原始代码: -
// Xcode 6.3 / Swift 1.2
UIView.animateWithDuration(0.25, animations: { _ in
self.detailsView?.alpha = 0
self.detailsView?.transform = CGAffineTransformMakeTranslation(0, -64);
}, completion: { finished in
self.detailsView?.hidden = true
})
无法使用模糊错误error: cannot invoke 'animateWithDuration' with an argument list of type '(FloatLiteralConvertible, animations: (($T3) -> ($T3) -> $T2) -> (($T3) -> $T2) -> $T2, completion: (($T5) -> ($T5) -> $T4) -> (($T5) -> $T4) -> $T4)'
经过一番挖掘后,我意识到这是由于completion:
闭包的返回类型,我发现了一个建议放入return
声明,并正确修复它: -
// Xcode 6.2 / Swift 1.1
UIView.animateWithDuration(0.25, animations: { _ in
self.detailsView?.alpha = 0
self.detailsView?.transform = CGAffineTransformMakeTranslation(0, -64);
}, completion: { finished in
self.detailsView?.hidden = true
return // this fixes it!
})
但我对此感到困惑。我看来,赋值self.detailsView?.hidden = true
为闭包创建了一个隐式的非void(可能是Bool)返回类型。实际上,完全删除该行允许代码编译。
但明确指定闭包类型并不能解决问题: -
// Xcode 6.2 / Swift 1.1
UIView.animateWithDuration(0.25, animations: { _ in
// ...
}, completion: { (finished:Bool) -> () in
self.detailsView?.hidden = true
}
......这真让我感到惊讶。对我来说,这说明我们已经声明了一个将返回void的闭包,并且当编译器看到无关的布尔赋值并且说"不,那个闭包返回一个Bool时,编译器会重写。"
这似乎破了,Xcode 6.2不再是测试版。这是Swift中的错误吗?