Swift:缺少参数的参数

时间:2014-07-17 17:42:37

标签: ios swift xcode6

1)我正在使用变量作为UIView.animateWithDuration中的第一个参数,如下所示:

var theDelay: Float = 1.0
    UIView.animateWithDuration( theDelay, animations: {
    cell.frame.origin.y = 0
})

和Xcode6(Beta 3)给我一个构建错误:'在调用'中参数'delay'缺少参数。

当我不使用变量时,该功能可以正常工作。当我发现这个问题时,我想调整变量(因为这段代码在循环中)。

2)或者,我可以跳过使用变量并在线计算:

UIView.animateWithDuration( indexPath.row * 1.0, animations: {
    cell.frame.origin.y = 0
})

但我得到了相同的错误'在参数'延迟'中缺少参数'。

我在这里做错了什么?

3 个答案:

答案 0 :(得分:9)

错误消息具有误导性。 animateWithDuration()的第一个参数 类型为NSTimeIntervalDouble),但您传递Float参数。 Swift不会隐式转换类型。

将变量定义更改为

let theDelay = 1.0

或显式转化

UIView.animateWithDuration(NSTimeInterval(indexPath.row), animations: {
    cell.frame.origin.y = 0
})

应该解决问题。

Swift 3 中,这将是

let theDelay = TimeInterval(indexPath.row)
UIView.animate(withDuration: theDelay, animations: {
    cell.frame.origin.y = 0
})

答案 1 :(得分:3)

我也从动画块中完全不相关的错误中得到了这个错误;我已经传递了有效的NSTimeInterval。它与delay参数无关,因此它向我显示的错误是错误的,让我在圈子中进行了一段时间。

因此请确保动画块内没有任何错误。

UIView.animateWithDuration(interval, animations: { () -> Void in // compiler will complain about this line missing a parameter
            // some code
            // some code with a syntax error in it, but Xcode won't show the error
            // some code
        })

答案 2 :(得分:1)

实际上Swift是类型语言,它需要传递与定义相同的类型参数 swift中没有隐式演员。

作为animateWithDuration的加法

class func animateWithDuration(duration: NSTimeInterval, animations: (() -> Void)!) // delay = 0.0, options = 0, completion = NULL

的参数类型为NSTimeInterval,如果您看到其声明,则声明为double

typealias NSTimeInterval = Double

因此需要Double参数值而不是Float值。 当您在代码中调用第二个时间时,swift正在使用类型干涉,即它会自动定义(不将float转换为double)indexPath.row * 1.0Double。以下代码可以正常工作。

var theDelay: NSTimeInterval = 1.0 

var theDelay: Double = 1.0  //this is same as above
UIView.animateWithDuration( theDelay, animations: {
    cell.frame.origin.y = 0
})

编译器误导你。所以总是传递与Swift中定义的parmeter类型相同的