【问题标题】:Swift - Extra Argument in callSwift - 通话中的额外参数
【发布时间】:2014-07-17 04:43:11
【问题描述】:

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

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

在 ViewController 类中:

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

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

详细ViewController类

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

这很简单,但我很困惑。

【问题讨论】:

  • 你问“电话中的额外争论?”然而该方法需要两个争论......所以没有额外的争论。
  • 这是一个错误吗? “通话中的额外参数”或问题
  • Extra Argument in call 是错误对不起!
  • ViewController 是一种类型吗?如果是这样,setCity 应该是一个类型方法:class func setCity(item : Cities, index : Int) {...}
  • No ViewController 不是类型

标签: swift


【解决方案1】:

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

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

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

瞧,没有更多错误了。

【讨论】:

  • 我遇到了一个非常相似的问题,我的两个 Objective-c 方法有相同的前缀,比如 update:... 之后有不同的参数列表。它抱怨一个不可能的额外参数错误,在阅读了这个答案之后,我尝试将它抱怨的方法重命名为 updateFoo: 并且这种细微的差异让编译器产生了真正的错误:我已经将一个参数声明为它的超类真正的类型。
  • 让我补充一点,当所讨论的方法采用 C 互操作性指针类型时,这也可能是一个问题。
  • @binarymochi 感谢您的评论。我刚刚遇到了那个确切的问题,并使用了你的建议来调试它。
  • 对我来说,我必须将 swift 类型(String、Dictionary)显式转换为 Objective-C 类型(NSString、NSMutableDictionary)。更改后它检测到正确的方法。
  • 当我错误地有一个额外的 { 我不应该有时,我得到了这个编译器错误。检查您的try/catchif let 以确保它们排成一行。希望这对其他人有帮助
【解决方案2】:

SwiftUI:

当您的所有代码都正确时,也会显示此错误消息“extra argument in call”,但已超出容器中的最大视图数(在SwiftUI)。 max = 10,所以如果你有一些不同的TextView、图片和它们之间的一些Spacers(),你很快就能超过这个数字。

我遇到了这个问题,并通过将一些视图“分组”到子容器“组”来解决它:

        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 ...
             
        }

【讨论】:

    【解决方案3】:

    在我的例子中,从 static 函数调用 non-static 函数会导致此错误。将函数更改为静态修复了错误。

    【讨论】:

      【解决方案4】:

      如果类/结构方法与同名但参数不同的全局方法之间存在冲突,则会出现此错误。例如,下面的代码会产生这个错误:

      您可能想检查您的 setCity 方法是否存在此类冲突。

      【讨论】:

      • 要显式调用全局函数,请使用模块名称。例如Swift.min(x,y).
      • 这是我见过的最可怕的屏幕背景颜色。你是怎么编程的?
      • 我有视力问题@FontFamily。
      • @Shripada 不开玩笑-请教育我。我想对这样的事情更加敏感。它不可能是红色/绿色失明或蓝色/黄色失明。你能分享什么?并为我是个混蛋道歉。
      【解决方案5】:

      你必须这样称呼它:

      ViewController.setCity(city, index: 5)
      

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

      【讨论】:

      • 我得到了同样的错误。世界上只有一种语言能让经验丰富的程序员在不知道如何调用函数时显得愚蠢。
      【解决方案6】:

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

      所以,基本上,检查整个表达式。如有必要,将其分解,将部分分配给临时变量。

      然后等待 Apple 修复它。

      【讨论】:

        【解决方案7】:

        如果 SwiftUI 中的 ViewBuilder 参数的视图超过 10 个,也会发生这种情况

        【讨论】:

          【解决方案8】:

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

          在运行Test target 时出现此错误,因为init 方法中添加了一个新参数,但Test target 的类中缺少该参数。

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-12-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-03-03
              相关资源
              最近更新 更多