【问题标题】:Swift: Missing Argument for ParameterSwift:缺少参数的参数
【发布时间】: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
})

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

我在这里做错了什么?

【问题讨论】:

    标签: ios swift xcode6


    【解决方案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中定义的参数类型相同的参数类型

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 2015-03-16
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多