呼叫中的额外参数

我试图从 DetailViewController 类中调用在 ViewController 类中声明的函数。

当尝试调试“调用中的额外参数”错误时弹出。

在 ViewController 类中:

func setCity(item : Cities, index : Int)
{


citiesArray!.removeObjectAtIndex(index)
citiesArray!.insertObject(item, atIndex: index)
}

在 Details ViewController 类中

 // city of type Cities
ViewController.setCity(city ,5 ) //Error: "Extra argument in call"

这很简单,但我很困惑。

82780 次浏览

你得这么说:

ViewController.setCity(city, index: 5)

Swift 具有(作为 Objective-C)命名的参数。

在某些情况下,即使调用看起来正确,如果参数的类型与函数声明的类型不匹配,也会给出“调用中的额外参数”。根据您的问题,您似乎试图将实例方法作为类方法来调用,我发现这就是其中的一种情况。例如,这段代码给出了完全相同的错误:

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(...)(注释中提到)来解决这个问题; 这将允许 ViewController.setCity调用按预期工作,但是我猜想您希望 setCity是一个实例方法,因为它似乎修改了实例状态。您可能希望为 ViewController 类获取一个实例,并使用该实例调用 setCity 方法。使用上面的代码示例进行说明,我们可以这样更改 Bar:

class Bar : Foo {
init() {
super.init()
let foo = Foo()
foo.name(1, b: 2)
}
}

瞧,没有错误了。

当编译器突出显示的表达式没有任何错误,指定的参数也没有任何错误时,我就出现了这个错误,但是在与原始参数链接的完全不同的行上出现了一个错误。例如: 用对象(b)和(c)初始化对象(a) ,它们本身分别用(d)和(e)初始化。编译器在(b)上说额外的参数,但实际上错误是(e)的类型和(c)的预期参数之间的类型不匹配。

因此,基本上,检查整个表达式。如果有必要,将它分解,将部分分配给临时变量。

然后等待苹果公司来修复它。

如果 class/struct 方法和具有相同名称但不同参数的全局方法之间存在冲突,则会发生此错误。例如,下面的代码将生成此错误:

enter image description here

您可能需要检查 setCity 方法是否存在这样的冲突。

在最新的 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!"

在我的案例中,从 静电干扰函数调用 非静电干扰函数导致了这个错误。将函数改为静态修复了这个错误。

SwiftUI:

当所有代码都正确,但容器中的 最大浏览次数超出时(在 SwiftUI 中) ,也会显示此错误消息“ 电话额外论点电话额外论点”。最大值 = 10,所以如果你有一些不同的文本视图,图片和一些间隔()之间,你可以很快超过这个数字。

我遇到了这个问题,并通过将一些观点“分组”到一个子集装箱“组”来解决它:

        VStack {
            

Text("Congratulations")
.font(.largeTitle)
.fontWeight(.bold)
            

Spacer()
            

// This grouping solved the problem
Group {
Text("You mastered a maze with 6 rooms!")
Text("You found all the 3 hidden items")
}
            

Spacer()


// other views ...
             

}

如果在 SwiftUI中有超过10个 ViewBuilder 参数视图,也可能发生这种情况

这不是这个问题的直接答案,但可能对某人有帮助。 在我的案例中,问题是同名类存在于不同的(测试) target中。

在运行 Test target时,我得到了这个错误,因为在 init方法中添加了一个新参数,但是在 Test target中的类中没有这个新参数。

将同样的参数添加到其他 init中也解决了这个问题。