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 56

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) именованные параметры.

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

enter image description here

вы можете проверить, есть ли такой конфликт для вашего метода 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!"