Swift – 额外的参数
我正在尝试从DetailViewController类调用ViewController类中声明的函数。
当试图debugging“额外的参数调用”错误popup。
在ViewController类中:
func setCity(item : Cities, index : Int) { citiesArray!.removeObjectAtIndex(index) citiesArray!.insertObject(item, atIndex: index) }
在detailViewController类
// city of type Cities ViewController.setCity(city ,5 ) //Error: "Extra argument in call"
这很简单,但我很困惑。
在某些情况下,即使调用看起来是正确的,如果参数的types与函数声明的types不匹配,也会给出“调用中的额外参数”。 从你的问题,看起来你试图调用一个实例方法作为一个类方法,我发现这是其中的一种情况。 例如,这段代码给出了完全相同的错误:
class Foo { func name(a:Int, b: Int) -> String { return "" } } class Bar : Foo { init() { super.init() Foo.name(1, b: 2) } }
你可以通过改变你的setCity声明为class func setCity(...)
(在注释中提到class func setCity(...)
来解决这个问题。 这将允许ViewController.setCity
调用按预期工作,但我猜你希望setCity
是一个实例方法,因为它似乎修改实例状态。 你可能想要一个实例到你的ViewController类,并使用它来调用setCity方法。 使用上面的代码示例进行了说明,我们可以将Bar更改为:
class Bar : Foo { init() { super.init() let foo = Foo() foo.name(1, b: 2) } }
瞧,没有更多的错误。
在我的情况下,从静态函数调用非 静态函数导致此错误。 改变function为静态修复错误。
你必须这样称呼它:
ViewController.setCity(city, index: 5)
Swift有(如Objective-C)命名参数。
如果类/结构方法和具有相同名称但参数不同的全局方法之间存在冲突,则会出现此错误。 例如,下面的代码会产生这个错误:
你可能想要检查你的setCity方法是否有这样的冲突。
如果编译器突出显示的expression式没有任何错误,并且指定的参数没有错误,但是在完全不同的行上有一个错误链接到原始错误,那么我有这个错误。 例如:用对象(b)和(c)初始化对象(a),它们分别用(d)和(e)初始化。 编译器在(b)上说额外的参数,但实际上错误是(e)的types和(c)的预期参数之间的types不匹配。
所以,基本上,检查整个expression式。 如有必要,分解它分配给临时variables的部分。
等待苹果来修复它。
在最新的Swift 2.2中,我也遇到了类似的错误,这让我花了一段时间才弄清楚这个愚蠢的错误
class Cat { var color: String var age: Int init (color: String, age: Int) { self.color = color self.age = age } convenience init (color: String) { self.init(color: color, age: 1){ //Here is where the error was "Extra argument 'age' in call } } } var RedCat = Cat(color: "red") print("RedCat is \(RedCat.color) and \(RedCat.age) year(s) old!")
修复相当简单,只需在'self.init(color:color,age:1)'之后删除额外的'{}'即可
convenience init (color: String) { self.init(color: color, age: 1) }
最终给出下面的输出
"RedCat is red and 1 year(s) old!"