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 中没有隐式转换。
作为animateWithDuration
in 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.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
中定义的参数类型相同的参数类型
【讨论】:
以上是关于Swift:缺少参数的参数的主要内容,如果未能解决你的问题,请参考以下文章
Swift 中的 PFUser logInWithUsernameInBackground - 参数“目标”调用缺少参数
使用 Swift 的 MKPolygon(调用中缺少参数“interiorPolygons”的参数)