Swift - Extra Argument in call

Swift

Swift Problem Overview


I am trying to call a function declared in ViewController class from DetailViewController class.

When trying to debug the 'Extra Argument in call" error pops up.

In ViewController class:

func setCity(item : Cities, index : Int)
{
    
    citiesArray!.removeObjectAtIndex(index)
    citiesArray!.insertObject(item, atIndex: index)
}

In detailViewController Class

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

This is pretty simple yet I'm baffled.

Swift Solutions


Solution 1 - Swift

In some cases, "Extra argument in call" is given even if the call looks right, if the types of the arguments don't match that of the function declaration. From your question, it looks like you're trying to call an instance method as a class method, which I've found to be one of those cases. For example, this code gives the exact same error:

class Foo {
    
    func name(a:Int, b: Int) -> String {
        return ""
    }
}

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

You can solve this in your code by changing your declaration of setCity to be class func setCity(...) (mentioned in the comments); this will allow the ViewController.setCity call to work as expected, but I'm guessing that you want setCity to be an instance method since it appears to modify instance state. You probably want to get an instance to your ViewController class and use that to call the setCity method. Illustrated using the code example above, we can change Bar as such:

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

Voila, no more error.

Solution 2 - Swift

SwiftUI:

This error message "extra argument in call" is also shown, when all your code is correct, but the maximum number of views in a container is exceeded (in SwiftUI). The max = 10, so if you have some different TextViews, images and some Spacers() between them, you quickly can exceed this number.

I had this problem and solved it by "grouping" some of the views to a sub container "Group":

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

Solution 3 - Swift

In my case calling non-static function from static function caused this error. Changing function to static fixed the error.

Solution 4 - Swift

This error will ensue, if there is a conflict between a class/struct method, and a global method with same name but different arguments. For instance, the following code will generate this error:

enter image description here

You might want to check if there is such conflict for your setCity method.

Solution 5 - Swift

You have to call it like this:

ViewController.setCity(city, index: 5)

Swift has (as Objective-C) named parameters.

Solution 6 - Swift

I have had this error when there is nothing at all wrong with the expression highlighted by the compiler and nothing wrong with the arguments specified, but there is an error on a completely different line somehow linked to the original one. For example: initialising object (a) with objects (b) and (c), themselves initialised with (d) and (e) respectively. The compiler says extra argument on (b), but in fact the error is a type mismatch between the type of (e) and the expected argument to (c).

So, basically, check the whole expression. If necessary, decompose it assigning the parts to temporary variables.

And wait for Apple to fix it.

Solution 7 - Swift

This can also happen if you have more than 10 views for ViewBuilder arguments in SwiftUI

Solution 8 - Swift

This is not the direct answer to this question but might help someone. In my case problem was that class with same name existed in a different (Test) target.

While running Test target I got this error as a new argument was added to init method but was missing in the class in Test target.

Adding the same argument also to other init solved the issue.

Solution 9 - Swift

In latest Swift 2.2, I had a similar error thrown which took me a while to sort out the silly mistake

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

The fix was rather simple, just removing the additional '{ }' after 'self.init(color: color, age: 1)' did the trick, i.e

 convenience init (color: String) {
        self.init(color: color, age: 1)
  }

which ultimately gives the below output

"RedCat is red and 1 year(s) old!"

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMarinView Question on Stackoverflow
Solution 1 - SwiftJesse RosaliaView Answer on Stackoverflow
Solution 2 - SwiftLukeSideWalkerView Answer on Stackoverflow
Solution 3 - SwiftibrahimyilmazView Answer on Stackoverflow
Solution 4 - SwiftShripadaView Answer on Stackoverflow
Solution 5 - SwiftdasdomView Answer on Stackoverflow
Solution 6 - SwiftrghomeView Answer on Stackoverflow
Solution 7 - SwiftScottyBladesView Answer on Stackoverflow
Solution 8 - SwiftHaseeb IqbalView Answer on Stackoverflow
Solution 9 - SwiftNaishtaView Answer on Stackoverflow