Swift:缺少参数的参数

Posted

技术标签:

【中文标题】Swift:缺少参数的参数【英文标题】:Swift: Missing Argument for Parameter 【发布时间】:2014-07-17 17:42:36 【问题描述】:

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

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

Xcode6(Beta 3)给我一个构建错误:'Missing argument for parameter 'delay' in call'。

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

2) 或者,我可以跳过使用变量并将计算包含在内:

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

但我收到相同的错误“调用中的参数“延迟”缺少参数”。

我在这里做错了什么?

【问题讨论】:

【参考方案1】:

错误信息具有误导性。 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
)

【讨论】:

我在 XCode 6 Beta 5 代码的新部分中再次遇到此错误。无论是否有明确的 Double 或 NSTimeInterval 参数。 嗯。我通过在 Build Phases 的库列表中显式添加 UIKit 来修复它。 好吧,可能是我在动画块中将 CGFloat 分配给 NSLayoutConstraint 而不是 NSLayoutConstraint.constant。所以,如果你有这个问题,你的块中可能还有另一个问题 swift 没有直接告诉你。一旦我也解决了这个问题,这个错误就消失了,代码运行了。 我按照我们应该的方式传递了NSTimeInterval,但我仍然收到此错误。 感谢匿名投票者,他提醒我更新 Swift 3 的代码 :)【参考方案2】:

我也从动画块中的一个完全不相关的错误中得到了这个错误;我已经传入了一个有效的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
        )

【讨论】:

很好,我遇到了同样的问题。需要将代码移出动画块以使编译器显示实际问题。该死!【参考方案3】:

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

作为animateWithDurationin decleration

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

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

typealias NSTimeInterval = Double

所以它需要Double 参数值而不是Float 值。 当您在代码中调用第二次时,swift 正在使用类型干扰,即它会自动定义(不将浮点数转换为双精度数)您的 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中定义的参数类型相同的参数类型

【讨论】:

以上是关于Swift:缺少参数的参数的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的 PFUser logInWithUsernameInBackground - 参数“目标”调用缺少参数

在调用 Swift 中缺少参数“编码器”的参数

使用 Swift 的 MKPolygon(调用中缺少参数“interiorPolygons”的参数)

调用//JSON 文件在 SWIFT 中损坏?缺少参数“委托”的参数?

Swift/MySQL/PHP“缺少必需参数”错误

使用 Swift 3 时出现错误“缺少必需的参数:grant_type”