Подтвердить что ты не робот

Swift - дополнительный аргумент в вызове

Я пытаюсь вызвать функцию, объявленную в классе ViewController, из класса DetailViewController.

При попытке отладки всплывает ошибка "Дополнительный аргумент в вызове".

В классе 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" 

Это довольно просто, но я озадачен.

4b9b3361

Ответ 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(...) (упомянутое в комментариях); это позволит вызову ViewController.setCity работать так, как ожидалось, но я предполагаю, что вы хотите, чтобы setCity был методом экземпляра, так как он изменил состояние экземпляра. Вероятно, вы захотите получить экземпляр класса ViewController и использовать его для вызова метода setCity. Иллюстрированный с использованием приведенного выше примера кода, мы можем изменить Bar как таковой:

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

Voila, больше ошибок.

Ответ 2

В моем случае вызов функции нестатической из статической функции вызвал эту ошибку. Изменение функции для статического исправления ошибки.

Ответ 3

Вы должны называть его следующим образом:

ViewController.setCity(city, index: 5)

Swift имеет (как Objective-C) именованные параметры.

Ответ 4

Эта ошибка будет возникать, если есть конфликт между методом class/struct и глобальным методом с тем же именем, но с разными аргументами. Например, следующий код генерирует эту ошибку:

enter image description here

Возможно, вы захотите проверить, существует ли такой конфликт для вашего метода setCity.

Ответ 5

У меня была эта ошибка, когда нет ничего плохого в выражении, выделенном компилятором, и ничего неправильного с указанными аргументами, но есть ошибка в совершенно другой строке, как-то связанной с исходной. Например: инициализация объекта (a) с объектами (b) и (c), которые сами инициализируются (d) и (e) соответственно. Компилятор говорит о дополнительном аргументе в (b), но на самом деле ошибка является несоответствием типа между типом (e) и ожидаемым аргументом (c).

Итак, в основном, проверьте все выражение. При необходимости разложите его, назначив части временным переменным.

И подождите, пока Apple его исправит.

Ответ 6

В последнем 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!"