Я только что попал в это. Похоже, что это ошибка с устаревшим кодом Swift 2.3, из-за небольшого протекания Swift 3. Я нашел ключевые ответы in the dev forums, а также некоторые дополнительные выводы от меня и моего коллеги.
Обход проблемы: Изменить аргумент (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 way. И шаблон для Великого переименования API - это то, что имена метода Swift 2 формы doSomethingWithParam(quuz)
переписаны для Swift 3 как doSomething(param: quuz)
. Xcode предполагает, что это произошло здесь, поэтому в ошибочной попытке получить исходное имя Swift 2 он добавляет WithSender
в конец имени метода. Обходное решение подчеркивания работает, делая сигнатуру метода Swift 3 идентичной Swift 2. (Я не знаю, почему @objc
аннотаций также решает проблему, в соответствии с Apple.)
[Отредактировано неоднократно с изменениями обходные.]
Спасибо за подробное обновление! Я подумал, что такое происходит. Моим текущим ** обходным путем ** является ** подключение @IBAction, а затем просмотр фактической розетки (правый щелчок на элементе представления) в Interface Builder **, который показывает строковый литерал для селектора на черном всплывающем окне ** ** и поэтому мне просто нужно ** обновить имя функции, чтобы оно соответствовало. ** – moyoteg
Спасибо за решение этой проблемы. Я не могу поверить в количество ошибок и проблем, возникших с Xcode 8 и Swift 3. У меня был рабочий проект до обновления. Я потратил не менее 8 часов на то, чтобы сделать работу над проектом после обновления. Все, от недостающих файлов заголовков до неподходящих подзадач, зависит от проблем с автоматической компоновкой IB и теперь обработчиков событий. SMH – itsben
Спасибо за работу вокруг и объяснение, яблоко предложило, что «добавление аннотации @objc» не работает для меня. поэтому я думаю, мы должны придерживаться «_» на данный момент. –