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!"