Ответ 1
Я тоже попал в это. Похоже, что это ошибка с устаревшим кодом Swift 2.3 из-за небольшого утечки Swift 3. Я нашел ключевые ответы в форумах dev, а также некоторые дополнительные выводы мной и моим коллегой.
Обход проблемы: Измените аргумент (sender: AnyObject)
на (_ sender: AnyObject)
. Вы получите предупреждение об измененной строке, которую вы можете спокойно игнорировать.
[ ОБНОВЛЕНО - другое обходное решение: Apple ответила на мой отчет об ошибке и предложила другое обходное решение: аннотировать метод @IBAction
с помощью @objc
. Я еще не подтвердил, что это работает.]
Что происходит: Похоже на ошибку в раскадрах Xcode 8. Моя интерпретация заключается в том, что он ошибочно анализирует методы Swift 2 @IBAction, как если бы они были Swift 3, а затем пытались преобразовать их в Swift 2.
Давайте подробно расскажем! В Swift 3, в отличие от Swift 2, задан метод, объявленный как:
@IBAction func foo(sender: AnyObject)
метка аргумента sender
фактически является частью имени метода и включается в вызовы этого метода. В Swift 2, конечно, первый аргумент по умолчанию не получает метки. В Swift 2 вы назовёте foo(myButton)
; в Swift 3 вы назовёте foo(sender: myButton)
.
Xcode 8 ошибочно читает эту функцию способом Swift 3. И шаблон для Великого переименования API - это то, что имена метода Swift 2 формы doSomethingWithParam(quuz)
переписаны для Swift 3 как doSomething(param: quuz)
. Xcode предполагает, что то, что произошло здесь, поэтому в ошибочной попытке получить исходное имя Swift 2, оно добавляет WithSender
к концу имени метода. Обходное решение подчеркивания работает, делая сигнатуру метода Swift 3 идентичной Swift 2. (Я не знаю, почему аннотация @objc
также решает проблему, согласно Apple.)
[Отредактировано несколько раз с изменениями обходных путей.]