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
})
但我得到了相同的错误'在参数'延迟'中缺少参数'。
我在这里做错了什么?
答案 0 :(得分:9)
错误消息具有误导性。 animateWithDuration()
的第一个参数
类型为NSTimeInterval
(Double
),但您传递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.0
到Double
。以下代码可以正常工作。
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类型相同的