Swift-дополнительный аргумент в вызове
Я пытаюсь вызвать функцию, объявленную в классе ViewController из класса DetailViewController.
при попытке отладки появляется ошибка" дополнительный аргумент в вызове".
в классе 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"
Это довольно просто, но я сбит с толку.
6 ответов:
в некоторых случаях" дополнительный аргумент в вызове " задается, даже если вызов выглядит правильно, если типы аргументов не соответствуют типу объявления функции. Из вашего вопроса похоже, что вы пытаетесь вызвать метод экземпляра как метод класса, который, как я обнаружил, является одним из таких случаев. Например, этот код дает точно такую же ошибку:
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. Иллюстрированный с помощью примера кода выше, мы можем изменить бар как таковой:class Bar : Foo { init() { super.init() let foo = Foo() foo.name(1, b: 2) } }
вуаля, больше никаких ошибок.
вы должны назвать это так:
ViewController.setCity(city, index: 5)
Swift имеет (как Objective-C) именованные параметры.
эта ошибка возникает, если существует конфликт между методом класса/структуры и глобальным методом с тем же именем, но разными аргументами. Например, следующий код будет генерировать эту ошибку:
вы можете проверить, есть ли такой конфликт для вашего метода setCity.
У меня была эта ошибка, когда нет ничего плохого в выражении, выделенном компилятором, и ничего плохого в указанных аргументах, но есть ошибка на совершенно другой строке, каким-то образом связанной с исходной. Например: инициализация объекта (a) с помощью объектов (b) и (c), которые сами инициализируются с помощью (d) и (e) соответственно. Компилятор говорит дополнительный аргумент на (b), но на самом деле ошибка является несоответствием типа между типом (e) и ожидаемым аргумент (с).
Итак, в основном, проверьте все выражение. При необходимости разложите его, присвоив части временным переменным.
и ждать Apple, чтобы исправить это.
в последнем 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(цвет: цвет, возраст: 1) ' сделал трюк, т. е.
convenience init (color: String) { self.init(color: color, age: 1) }
что в конечном итоге дает ниже выхода
"RedCat is red and 1 year(s) old!"