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"
Это довольно просто, но я озадачен.
Ответы
Ответ 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!"