Swift 1.1 / Xcode 6.2中的animateWithDuration

时间:2015-03-11 10:22:16

标签: ios xcode swift

最近在不同的Xcode 6.x版本之间移动,由于编译错误,很难保持我们的Swift代码稳定。我不明白的一个问题与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)'

在Swift 1.1下编译

经过一番挖掘后,我意识到这是由于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中的错误吗?

0 个答案:

没有答案